ΠΠ΄ΡΠ°Π²Π΅ΠΉ Habr! ΠΠ°Π±ΠΎΡΠΈΡΠ΅ ΠΎΡ Π΄Π°Π½Π½ΠΈ Π·Π° Π³ΠΎΠ»Π΅ΠΌΠΈ Π΄Π°Π½Π½ΠΈ ΠΈ ΠΌΠ°ΡΠΈΠ½Π½ΠΎ ΠΎΠ±ΡΡΠ΅Π½ΠΈΠ΅ ΡΠ°ΡΡΠ°Ρ Π΅ΠΊΡΠΏΠΎΠ½Π΅Π½ΡΠΈΠ°Π»Π½ΠΎ ΠΈ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠΌΠ΅ Π² ΠΊΡΠ°ΠΊ Ρ ΡΡΡ
. ΠΠ°ΡΠ°ΡΠ° ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΡ Π·Π° Π΄ΡΡΠ³Π° ΠΈΠ½ΠΎΠ²Π°ΡΠΈΠ²Π½Π° ΡΠ΅Ρ
Π½ΠΎΠ»ΠΎΠ³ΠΈΡ Π² ΠΎΠ±Π»Π°ΡΡΡΠ° Π½Π° Π²ΠΈΡΠΎΠΊΠΎΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΈΡΠ΅ ΠΈΠ·ΡΠΈΡΠ»Π΅Π½ΠΈΡ (HPC, High Performance Computing), ΠΏΠΎΠΊΠ°Π·Π°Π½Π° Π½Π° ΡΠ°Π½Π΄Π° Π½Π° Kingston Π½Π°
ΠΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ° Π½Π° GPU ΠΈΠ·ΠΏΡΠ΅Π²Π°ΡΠ²Π° Π·Π°ΡΠ΅ΠΆΠ΄Π°Π½Π΅ΡΠΎ Π½Π° Π΄Π°Π½Π½ΠΈ
Π‘Π»Π΅Π΄ ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ΡΠΎ Π½Π° CUDA, Π±Π°Π·ΠΈΡΠ°Π½Π° Π½Π° GPU Ρ Π°ΡΠ΄ΡΠ΅ΡΠ½ΠΎ-ΡΠΎΡΡΡΠ΅ΡΠ½Π° ΠΏΠ°ΡΠ°Π»Π΅Π»Π½Π° ΠΈΠ·ΡΠΈΡΠ»ΠΈΡΠ΅Π»Π½Π° Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ° Π·Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ²Π°Π½Π΅ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Ρ ΠΎΠ±ΡΠΎ ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, ΠΏΡΠ΅Π· 2007 Π³., Ρ Π°ΡΠ΄ΡΠ΅ΡΠ½ΠΈΡΠ΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π½Π° ΡΠ°ΠΌΠΈΡΠ΅ GPU Π½Π°ΡΠ°ΡΠ½Π°Ρ Π° Π½Π΅Π²Π΅ΡΠΎΡΡΠ½ΠΎ. ΠΠ½Π΅Ρ Π³ΡΠ°ΡΠΈΡΠ½ΠΈΡΠ΅ ΠΏΡΠΎΡΠ΅ΡΠΎΡΠΈ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ Π²ΡΠ΅ ΠΏΠΎΠ²Π΅ΡΠ΅ Π² HPC ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΊΠ°ΡΠΎ Π³ΠΎΠ»Π΅ΠΌΠΈ Π΄Π°Π½Π½ΠΈ, ΠΌΠ°ΡΠΈΠ½Π½ΠΎ ΠΎΠ±ΡΡΠ΅Π½ΠΈΠ΅ (ML) ΠΈ Π΄ΡΠ»Π±ΠΎΠΊΠΎ ΠΎΠ±ΡΡΠ΅Π½ΠΈΠ΅ (DL).
ΠΠΌΠ°ΠΉΡΠ΅ ΠΏΡΠ΅Π΄Π²ΠΈΠ΄, ΡΠ΅ Π²ΡΠΏΡΠ΅ΠΊΠΈ ΡΡ ΠΎΠ΄ΡΡΠ²ΠΎΡΠΎ Π½Π° ΡΠ΅ΡΠΌΠΈΠ½ΠΈΡΠ΅, ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ Π΄Π²Π΅ ΡΠ° Π°Π»Π³ΠΎΡΠΈΡΠΌΠΈΡΠ½ΠΎ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π·Π°Π΄Π°ΡΠΈ. ML ΠΎΠ±ΡΡΠ°Π²Π° ΠΊΠΎΠΌΠΏΡΡΡΡΠ° Π²ΡΠ· ΠΎΡΠ½ΠΎΠ²Π° Π½Π° ΡΡΡΡΠΊΡΡΡΠΈΡΠ°Π½ΠΈ Π΄Π°Π½Π½ΠΈ, Π΄ΠΎΠΊΠ°ΡΠΎ DL ΠΎΠ±ΡΡΠ°Π²Π° ΠΊΠΎΠΌΠΏΡΡΡΡΠ° Π²ΡΠ· ΠΎΡΠ½ΠΎΠ²Π° Π½Π° ΠΎΠ±ΡΠ°ΡΠ½Π° Π²ΡΡΠ·ΠΊΠ° ΠΎΡ Π½Π΅Π²ΡΠΎΠ½Π½Π° ΠΌΡΠ΅ΠΆΠ°. ΠΡΠΈΠΌΠ΅Ρ Π·Π° ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅ Π½Π° ΡΠ°Π·Π»ΠΈΠΊΠΈΡΠ΅ Π΅ Π΄ΠΎΡΡΠ° ΠΏΡΠΎΡΡ. ΠΠ° ΠΏΡΠΈΠ΅ΠΌΠ΅ΠΌ, ΡΠ΅ ΠΊΠΎΠΌΠΏΡΡΡΡΡΡ ΡΡΡΠ±Π²Π° Π΄Π° ΠΏΡΠ°Π²ΠΈ ΡΠ°Π·Π»ΠΈΠΊΠ° ΠΌΠ΅ΠΆΠ΄Ρ ΡΠ½ΠΈΠΌΠΊΠΈ Π½Π° ΠΊΠΎΡΠΊΠΈ ΠΈ ΠΊΡΡΠ΅ΡΠ°, ΠΊΠΎΠΈΡΠΎ ΡΠ° Π·Π°ΡΠ΅Π΄Π΅Π½ΠΈ ΠΎΡ ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ° Π·Π° ΡΡΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅. ΠΠ° ML ΡΡΡΠ±Π²Π° Π΄Π° ΠΈΠ·ΠΏΡΠ°ΡΠΈΡΠ΅ Π½Π°Π±ΠΎΡ ΠΎΡ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ Ρ ΠΌΠ½ΠΎΠ³ΠΎ Π΅ΡΠΈΠΊΠ΅ΡΠΈ, Π²ΡΠ΅ΠΊΠΈ ΠΎΡ ΠΊΠΎΠΈΡΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Ρ Π΅Π΄Π½Π° ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½Π° Ρ Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠ° Π½Π° ΠΆΠΈΠ²ΠΎΡΠ½ΠΎΡΠΎ. ΠΠ° DL Π΅ Π΄ΠΎΡΡΠ°ΡΡΡΠ½ΠΎ Π΄Π° ΠΊΠ°ΡΠΈΡΠ΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎ-Π³ΠΎΠ»ΡΠΌ Π±ΡΠΎΠΉ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ, Π½ΠΎ ΡΠ°ΠΌΠΎ Ρ Π΅Π΄ΠΈΠ½ Π΅ΡΠΈΠΊΠ΅Ρ βΡΠΎΠ²Π° Π΅ ΠΊΠΎΡΠΊΠ°β ΠΈΠ»ΠΈ βΡΠΎΠ²Π° Π΅ ΠΊΡΡΠ΅β. DL Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ Π½Π° Π½Π°ΡΠΈΠ½Π°, ΠΏΠΎ ΠΊΠΎΠΉΡΠΎ ΡΠ΅ ΡΡΠ°Ρ ΠΌΠ°Π»ΠΊΠΈΡΠ΅ Π΄Π΅ΡΠ° - ΠΏΡΠΎΡΡΠΎ ΠΈΠΌ ΡΠ΅ ΠΏΠΎΠΊΠ°Π·Π²Π°Ρ ΡΠ½ΠΈΠΌΠΊΠΈ Π½Π° ΠΊΡΡΠ΅ΡΠ° ΠΈ ΠΊΠΎΡΠΊΠΈ Π² ΠΊΠ½ΠΈΠ³ΠΈΡΠ΅ ΠΈ Π² ΠΆΠΈΠ²ΠΎΡΠ° (Π½Π°ΠΉ-ΡΠ΅ΡΡΠΎ, Π±Π΅Π· Π΄ΠΎΡΠΈ Π΄Π° ΡΠ΅ ΠΎΠ±ΡΡΠ½ΡΠ²Π° ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ ΡΠ°Π·Π»ΠΈΠΊΠ°ΡΠ°), Π° ΠΌΠΎΠ·ΡΠΊΡΡ Π½Π° Π΄Π΅ΡΠ΅ΡΠΎ ΡΠ°ΠΌ Π·Π°ΠΏΠΎΡΠ²Π° Π΄Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»Ρ Π²ΠΈΠ΄Π° Π½Π° ΠΆΠΈΠ²ΠΎΡΠ½ΠΎΡΠΎ ΡΠ»Π΅Π΄ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ ΠΊΡΠΈΡΠΈΡΠ΅Π½ Π±ΡΠΎΠΉ ΡΠ½ΠΈΠΌΠΊΠΈ Π·Π° ΡΡΠ°Π²Π½Π΅Π½ΠΈΠ΅ (Π‘ΠΏΠΎΡΠ΅Π΄ ΠΎΡΠ΅Π½ΠΊΠΈΡΠ΅ Π³ΠΎΠ²ΠΎΡΠΈΠΌ ΡΠ°ΠΌΠΎ Π·Π° ΡΡΠΎ ΠΈΠ»ΠΈ Π΄Π²Π΅ ΠΏΡΠ΅Π΄Π°Π²Π°Π½ΠΈΡ ΠΏΡΠ΅Π· ΡΠ°Π½Π½ΠΎΡΠΎ Π΄Π΅ΡΡΡΠ²ΠΎ). ΠΠ»Π³ΠΎΡΠΈΡΠΌΠΈΡΠ΅ Π·Π° DL Π²ΡΠ΅ ΠΎΡΠ΅ Π½Π΅ ΡΠ° ΡΠΎΠ»ΠΊΠΎΠ²Π° ΡΡΠ²ΡΡΡΠ΅Π½ΠΈ: Π·Π° Π΄Π° ΠΌΠΎΠΆΠ΅ Π΅Π΄Π½Π° Π½Π΅Π²ΡΠΎΠ½Π½Π° ΠΌΡΠ΅ΠΆΠ° Π΄Π° ΡΠ°Π±ΠΎΡΠΈ ΡΡΠΏΠ΅ΡΠ½ΠΎ ΠΈ Π²ΡΡΡ Ρ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΡΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ, Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° ΡΠ΅ ΠΏΠΎΠ΄Π°Π²Π°Ρ ΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ²Π°Ρ ΠΌΠΈΠ»ΠΈΠΎΠ½ΠΈ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ Π² GPU.
Π Π΅Π·ΡΠΌΠ΅ Π½Π° ΠΏΡΠ΅Π΄Π³ΠΎΠ²ΠΎΡΠ°: Π½Π° Π±Π°Π·Π°ΡΠ° Π½Π° GPU ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΡΠ·Π΄Π°Π²Π°ΡΠ΅ HPC ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π² ΠΎΠ±Π»Π°ΡΡΡΠ° Π½Π° Big Data, ML ΠΈ DL, Π½ΠΎ ΠΈΠΌΠ° ΠΏΡΠΎΠ±Π»Π΅ΠΌ - Π½Π°Π±ΠΎΡΠΈΡΠ΅ ΠΎΡ Π΄Π°Π½Π½ΠΈ ΡΠ° ΡΠΎΠ»ΠΊΠΎΠ²Π° Π³ΠΎΠ»Π΅ΠΌΠΈ, ΡΠ΅ Π²ΡΠ΅ΠΌΠ΅ΡΠΎ, ΠΏΡΠ΅ΠΊΠ°ΡΠ°Π½ΠΎ Π·Π° Π·Π°ΡΠ΅ΠΆΠ΄Π°Π½Π΅ Π½Π° Π΄Π°Π½Π½ΠΈ ΠΎΡ ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ° Π·Π° ΡΡΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ Π² GPU Π·Π°ΠΏΠΎΡΠ²Π° Π΄Π° Π½Π°ΠΌΠ°Π»ΡΠ²Π° ΡΡΠ»ΠΎΡΡΠ½Π°ΡΠ° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ. Π‘ Π΄ΡΡΠ³ΠΈ Π΄ΡΠΌΠΈ, Π±ΡΡΠ·ΠΈΡΠ΅ GPU ΠΎΡΡΠ°Π²Π°Ρ Π½Π΅Π΄ΠΎΡΡΠ°ΡΡΡΠ½ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ΠΈ ΠΏΠΎΡΠ°Π΄ΠΈ Π±Π°Π²Π½ΠΈ I/O Π΄Π°Π½Π½ΠΈ, ΠΈΠ΄Π²Π°ΡΠΈ ΠΎΡ Π΄ΡΡΠ³ΠΈ ΠΏΠΎΠ΄ΡΠΈΡΡΠ΅ΠΌΠΈ. Π Π°Π·Π»ΠΈΠΊΠ°ΡΠ° Π² I/O ΡΠΊΠΎΡΠΎΡΡΡΠ° Π½Π° GPU ΠΈ ΡΠΈΠ½Π°ΡΠ° ΠΊΡΠΌ CPU/ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ° Π·Π° ΡΡΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΎΡ ΠΏΠΎΡΡΠ΄ΡΠΊ.
ΠΠ°ΠΊ ΡΠ°Π±ΠΎΡΠΈ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡΡΠ° GPUDirect Storage?
ΠΡΠΎΡΠ΅ΡΡΡ Π½Π° Π²Ρ ΠΎΠ΄/ΠΈΠ·Ρ ΠΎΠ΄ ΡΠ΅ ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΠ° ΠΎΡ ΠΏΡΠΎΡΠ΅ΡΠΎΡΠ°, ΠΊΠ°ΠΊΡΠΎ ΠΈ ΠΏΡΠΎΡΠ΅ΡΡΡ Π½Π° Π·Π°ΡΠ΅ΠΆΠ΄Π°Π½Π΅ Π½Π° Π΄Π°Π½Π½ΠΈ ΠΎΡ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ΡΠΎ ΠΊΡΠΌ Π³ΡΠ°ΡΠΈΡΠ½ΠΈΡΠ΅ ΠΏΡΠΎΡΠ΅ΡΠΎΡΠΈ Π·Π° ΠΏΠΎ-Π½Π°ΡΠ°ΡΡΡΠ½Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ°. Π’ΠΎΠ²Π° Π΄ΠΎΠ²Π΅Π΄Π΅ Π΄ΠΎ ΠΈΡΠΊΠ°Π½Π΅ Π·Π° ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡ, ΠΊΠΎΡΡΠΎ Π΄Π° ΠΎΡΠΈΠ³ΡΡΠΈ Π΄ΠΈΡΠ΅ΠΊΡΠ΅Π½ Π΄ΠΎΡΡΡΠΏ ΠΌΠ΅ΠΆΠ΄Ρ GPU ΠΈ NVMe ΡΡΡΡΠΎΠΉΡΡΠ²Π° Π·Π° Π±ΡΡΠ·Π° ΠΊΠΎΠΌΡΠ½ΠΈΠΊΠ°ΡΠΈΡ ΠΏΠΎΠΌΠ΅ΠΆΠ΄Ρ ΡΠΈ. NVIDIA Π±Π΅ΡΠ΅ ΠΏΡΡΠ²Π°ΡΠ°, ΠΊΠΎΡΡΠΎ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠΈ ΡΠ°ΠΊΠ°Π²Π° ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡ ΠΈ Ρ Π½Π°ΡΠ΅ΡΠ΅ GPUDirect Storage. ΠΡΡΡΠ½ΠΎΡΡ ΡΠΎΠ²Π° Π΅ Π²Π°ΡΠΈΠ°Π½Ρ Π½Π° ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡΡΠ° GPUDirect RDMA (Remote Direct Memory Address), ΠΊΠΎΡΡΠΎ ΡΠ΅ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΈΡ Π° ΠΏΠΎ-ΡΠ°Π½ΠΎ.
ΠΠΆΠ΅Π½ΡΡΠ½ Π₯ΡΠ°Π½Π³, Π³Π»Π°Π²Π΅Π½ ΠΈΠ·ΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π΅Π½ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡ Π½Π° NVIDIA, ΡΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈ GPUDirect Storage ΠΊΠ°ΡΠΎ Π²Π°ΡΠΈΠ°Π½Ρ Π½Π° GPUDirect RDMA Π½Π° SC-19. ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: NVIDIA
Π Π°Π·Π»ΠΈΠΊΠ°ΡΠ° ΠΌΠ΅ΠΆΠ΄Ρ GPUDirect RDMA ΠΈ GPUDirect Storage Π΅ Π² ΡΡΡΡΠΎΠΉΡΡΠ²Π°ΡΠ°, ΠΌΠ΅ΠΆΠ΄Ρ ΠΊΠΎΠΈΡΠΎ ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π° Π°Π΄ΡΠ΅ΡΠΈΡΠ°Π½Π΅. Π’Π΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡΡΠ° GPUDirect RDMA Π΅ ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½Π° Π·Π° Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ ΠΏΡΠ΅ΠΌΠ΅ΡΡΠ²Π°Π½Π΅ Π½Π° Π΄Π°Π½Π½ΠΈ ΠΌΠ΅ΠΆΠ΄Ρ ΠΏΡΠ΅Π΄Π½Π°ΡΠ° ΠΌΡΠ΅ΠΆΠΎΠ²Π° ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ½Π° ΠΊΠ°ΡΡΠ° (NIC) ΠΈ GPU ΠΏΠ°ΠΌΠ΅Ρ, Π° GPUDirect Storage ΠΎΡΠΈΠ³ΡΡΡΠ²Π° Π΄ΠΈΡΠ΅ΠΊΡΠ΅Π½ ΠΏΡΡ Π·Π° Π΄Π°Π½Π½ΠΈ ΠΌΠ΅ΠΆΠ΄Ρ Π»ΠΎΠΊΠ°Π»Π½ΠΎ ΠΈΠ»ΠΈ ΠΎΡΠ΄Π°Π»Π΅ΡΠ΅Π½ΠΎ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅, ΠΊΠ°ΡΠΎ NVMe ΠΈΠ»ΠΈ NVMe over Fabric (NVMe-oF) ΠΈ GPU ΠΏΠ°ΠΌΠ΅Ρ.
ΠΠ°ΠΊΡΠΎ GPUDirect RDMA, ΡΠ°ΠΊΠ° ΠΈ GPUDirect Storage ΠΈΠ·Π±ΡΠ³Π²Π°Ρ Π½Π΅Π½ΡΠΆΠ½ΠΈΡΠ΅ Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΡ Π½Π° Π΄Π°Π½Π½ΠΈ ΠΏΡΠ΅Π· Π±ΡΡΠ΅Ρ Π² ΠΏΠ°ΠΌΠ΅ΡΡΠ° Π½Π° ΠΏΡΠΎΡΠ΅ΡΠΎΡΠ° ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π°Ρ Π½Π° ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠ° Π·Π° Π΄ΠΈΡΠ΅ΠΊΡΠ΅Π½ Π΄ΠΎΡΡΡΠΏ Π΄ΠΎ ΠΏΠ°ΠΌΠ΅ΡΡΠ° (DMA) Π΄Π° ΠΏΡΠ΅ΠΌΠ΅ΡΡΠ²Π° Π΄Π°Π½Π½ΠΈ ΠΎΡ ΠΌΡΠ΅ΠΆΠΎΠ²Π°ΡΠ° ΠΊΠ°ΡΡΠ° ΠΈΠ»ΠΈ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ ΠΊΡΠΌ ΠΈΠ»ΠΈ ΠΎΡ ΠΏΠ°ΠΌΠ΅ΡΡΠ° Π½Π° GPU - Π²ΡΠΈΡΠΊΠΎ ΡΠΎΠ²Π° Π±Π΅Π· Π½Π°ΡΠΎΠ²Π°ΡΠ²Π°Π½Π΅ Π½Π° ΡΠ΅Π½ΡΡΠ°Π»Π½ΠΈΡ ΠΏΡΠΎΡΠ΅ΡΠΎΡ. ΠΠ° GPUDirect Storage ΠΌΠ΅ΡΡΠΎΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Π½Π° Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ΡΠΎ Π½ΡΠΌΠ° Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅: ΡΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ NVME Π΄ΠΈΡΠΊ Π² GPU ΠΌΠΎΠ΄ΡΠ», Π² ΡΡΠ΅Π»Π°ΠΆ ΠΈΠ»ΠΈ ΡΠ²ΡΡΠ·Π°Π½ΠΎ ΠΏΡΠ΅Π· ΠΌΡΠ΅ΠΆΠ°ΡΠ° ΠΊΠ°ΡΠΎ NVMe-oF.
Π‘Ρ
Π΅ΠΌΠ° Π½Π° ΡΠ°Π±ΠΎΡΠ° Π½Π° GPUDirect Storage. ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: NVIDIA
Hi-End ΡΠΈΡΡΠ΅ΠΌΠΈΡΠ΅ Π·Π° ΡΡΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ Π½Π° NVMe ΡΠ° ΡΡΡΡΠ΅Π½ΠΈ Π½Π° ΠΏΠ°Π·Π°ΡΠ° Π½Π° HPC ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ
ΠΡΡΠ·Π½Π°Π²Π°ΠΉΠΊΠΈ, ΡΠ΅ Ρ Π½Π°Π²Π»ΠΈΠ·Π°Π½Π΅ΡΠΎ Π½Π° GPUDirect Storage, ΠΈΠ½ΡΠ΅ΡΠ΅ΡΡΡ Π½Π° Π³ΠΎΠ»Π΅ΠΌΠΈΡΠ΅ ΠΊΠ»ΠΈΠ΅Π½ΡΠΈ ΡΠ΅ Π±ΡΠ΄Π΅ Π½Π°ΡΠΎΡΠ΅Π½ ΠΊΡΠΌ ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π½Π΅ Π½Π° ΡΠΈΡΡΠ΅ΠΌΠΈ Π·Π° ΡΡΡ
ΡΠ°Π½Π΅Π½ΠΈΠ΅ Ρ I/O ΡΠΊΠΎΡΠΎΡΡΠΈ, ΡΡΠΎΡΠ²Π΅ΡΡΡΠ²Π°ΡΠΈ Π½Π° ΠΏΡΠΎΠΏΡΡΠΊΠ°ΡΠ΅Π»Π½Π°ΡΠ° ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ Π½Π° GPU, Π½Π° ΠΈΠ·Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ SC-19 Kingston ΠΏΠΎΠΊΠ°Π·Π° Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠ°ΡΠΈΡ Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ°, ΡΡΡΡΠΎΡΡΠ° ΡΠ΅ ΠΎΡ ΡΠΈΡΡΠ΅ΠΌΠ° Π·Π° ΡΡΡ
ΡΠ°Π½Π΅Π½ΠΈΠ΅, Π±Π°Π·ΠΈΡΠ°Π½Π° Π½Π° NVMe Π΄ΠΈΡΠΊΠΎΠ²Π΅ ΠΈ ΠΌΠΎΠ΄ΡΠ» Ρ Π³ΡΠ°ΡΠΈΡΠ΅Π½ ΠΏΡΠΎΡΠ΅ΡΠΎΡ, ΠΊΠΎΠΉΡΠΎ Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ° Ρ
ΠΈΠ»ΡΠ΄ΠΈ ΡΠ°ΡΠ΅Π»ΠΈΡΠ½ΠΈ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ Π² ΡΠ΅ΠΊΡΠ½Π΄Π°. ΠΠ΅ΡΠ΅ ΠΏΠΈΡΠ°Ρ
ΠΌΠ΅ Π·Π° ΡΠ°ΠΊΠ°Π²Π° ΡΠΈΡΡΠ΅ΠΌΠ° Π·Π° ΡΡΡ
ΡΠ°Π½Π΅Π½ΠΈΠ΅, Π±Π°Π·ΠΈΡΠ°Π½Π° Π½Π° 10 DC1000M U.2 NVMe ΡΡΡΡΠΎΠΉΡΡΠ²Π°
Π‘ΠΈΡΡΠ΅ΠΌΠ° Π·Π° ΡΡΡ
ΡΠ°Π½Π΅Π½ΠΈΠ΅, Π±Π°Π·ΠΈΡΠ°Π½Π° Π½Π° 10 DC1000M U.2 NVMe ΡΡΡΡΠΎΠΉΡΡΠ²Π°, Π΄ΠΎΠΏΡΠ»Π²Π° Π°Π΄Π΅ΠΊΠ²Π°ΡΠ½ΠΎ ΡΡΡΠ²ΡΡ Ρ Π³ΡΠ°ΡΠΈΡΠ½ΠΈ ΡΡΠΊΠΎΡΠΈΡΠ΅Π»ΠΈ. ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: Kingston
Π’Π°Π·ΠΈ ΡΠΈΡΡΠ΅ΠΌΠ° Π·Π° ΡΡΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ Π΅ ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠ°Π½Π° ΠΊΠ°ΡΠΎ 1U ΠΈΠ»ΠΈ ΠΏΠΎ-Π³ΠΎΠ»ΡΠΌ ΡΡΠ΅Π»Π°ΠΆ ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΌΠ°ΡΠ°Π±ΠΈΡΠ°Π½Π° Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ ΠΎΡ Π±ΡΠΎΡ Π½Π° DC1000M U.2 NVMe ΡΡΡΡΠΎΠΉΡΡΠ²Π°, Π²ΡΠ΅ΠΊΠΈ Ρ ΠΊΠ°ΠΏΠ°ΡΠΈΡΠ΅Ρ ΠΎΡ 3.84-7.68 TB. DC1000M Π΅ ΠΏΡΡΠ²ΠΈΡΡ NVMe SSD ΠΌΠΎΠ΄Π΅Π» Π²ΡΠ² ΡΠΎΡΠΌ-ΡΠ°ΠΊΡΠΎΡ U.2 Π² Π»ΠΈΠ½ΠΈΡΡΠ° ΡΡΡΡΠΎΠΉΡΡΠ²Π° Π½Π° Kingston Π·Π° ΡΠ΅Π½ΡΡΠΎΠ²Π΅ Π·Π° Π΄Π°Π½Π½ΠΈ. Π’ΠΎΠΉ ΠΈΠΌΠ° ΡΠ΅ΠΉΡΠΈΠ½Π³ Π½Π° ΠΈΠ·Π΄ΡΡΠΆΠ»ΠΈΠ²ΠΎΡΡ (DWPD, Drive writes per day), ΠΊΠΎΠ΅ΡΠΎ ΠΌΡ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° ΠΏΡΠ΅Π·Π°ΠΏΠΈΡΠ²Π° Π΄Π°Π½Π½ΠΈ Π΄ΠΎ ΠΏΡΠ»Π½ΠΈΡ ΠΈΠΌ ΠΊΠ°ΠΏΠ°ΡΠΈΡΠ΅Ρ Π²Π΅Π΄Π½ΡΠΆ Π½Π° Π΄Π΅Π½ Π·Π° Π³Π°ΡΠ°Π½ΡΠΈΡΠ°Π½ΠΈΡ ΠΆΠΈΠ²ΠΎΡ Π½Π° ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎΡΠΎ.
Π ΡΠ΅ΡΡΠ° fio v3.13 Π½Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½Π°ΡΠ° ΡΠΈΡΡΠ΅ΠΌΠ° Ubuntu 18.04.3 LTS, ΡΠ΄ΡΠΎΡΠΎ Π½Π° Linux 5.0.0-31-generic, ΠΈΠ·Π²Π°Π΄ΠΊΠ°ΡΠ° Π·Π° ΡΡΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ Π½Π° ΠΈΠ·Π»ΠΎΠΆΠ±Π° ΠΏΠΎΠΊΠ°Π·Π° ΡΠΊΠΎΡΠΎΡΡ Π½Π° ΡΠ΅ΡΠ΅Π½Π΅ (Sustained Read) ΠΎΡ 5.8 ΠΌΠΈΠ»ΠΈΠΎΠ½Π° IOPS Ρ ΡΡΡΠΎΠΉΡΠΈΠ²Π° ΠΏΡΠΎΠΏΡΡΠΊΠ°ΡΠ΅Π»Π½Π° ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ (Sustained Bandwidth ) ΠΎΡ 23.8 Gbit/s.
ΠΡΠΈΠ΅Π» ΠΠ΅ΡΠ΅Ρ, SSD Π±ΠΈΠ·Π½Π΅Ρ ΠΌΠ΅Π½ΠΈΠ΄ΠΆΡΡ Π² Kingston, ΠΊΠ°Π·Π° Π·Π° Π½ΠΎΠ²ΠΈΡΠ΅ ΡΠΈΡΡΠ΅ΠΌΠΈ Π·Π° ΡΡΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅: βΠΠΈΠ΅ ΡΠΌΠ΅ Π³ΠΎΡΠΎΠ²ΠΈ Π΄Π° ΠΎΠ±ΠΎΡΡΠ΄Π²Π°ΠΌΠ΅ ΡΠ»Π΅Π΄Π²Π°ΡΠΎΡΠΎ ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠ΅ ΡΡΡΠ²ΡΡΠΈ Ρ U.2 NVMe SSD ΡΠ΅ΡΠ΅Π½ΠΈΡ, Π·Π° Π΄Π° Π΅Π»ΠΈΠΌΠΈΠ½ΠΈΡΠ°ΠΌΠ΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΡ ΡΠ΅ΡΠ½ΠΈΡΠ΅ ΠΌΠ΅ΡΡΠ° ΠΏΡΠΈ ΡΡΠ°Π½ΡΡΠ΅ΡΠ° Π½Π° Π΄Π°Π½Π½ΠΈ, ΠΊΠΎΠΈΡΠΎ ΡΡΠ°Π΄ΠΈΡΠΈΠΎΠ½Π½ΠΎ ΡΠ΅ ΡΠ²ΡΡΠ·Π²Π°Ρ ΡΡΡ ΡΡΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ΡΠΎ. ΠΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΡΡΠ° ΠΎΡ NVMe SSD Π΄ΠΈΡΠΊΠΎΠ²Π΅ ΠΈ Π½Π°ΡΠΈΡ ΠΏΡΡΠ²ΠΎΠΊΠ»Π°ΡΠ΅Π½ Server Premier DRAM ΠΏΡΠ°Π²ΠΈ Kingston Π΅Π΄ΠΈΠ½ ΠΎΡ Π½Π°ΠΉ-Π²ΡΠ΅ΠΎΠ±Ρ Π²Π°ΡΠ½ΠΈΡΠ΅ Π΄ΠΎΡΡΠ°Π²ΡΠΈΡΠΈ Π½Π° ΡΠ΅ΡΠ΅Π½ΠΈΡ Π·Π° Π΄Π°Π½Π½ΠΈ ΠΎΡ ΠΊΡΠ°ΠΉ Π΄ΠΎ ΠΊΡΠ°ΠΉ Π² ΠΈΠ½Π΄ΡΡΡΡΠΈΡΡΠ°."
Π’Π΅ΡΡΡΡ gfio v3.13 ΠΏΠΎΠΊΠ°Π·Π° ΠΏΡΠΎΠΏΡΡΠΊΠ°ΡΠ΅Π»Π½Π° ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ ΠΎΡ 23.8 Gbps Π·Π° Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠ°ΡΠΈΠΎΠ½Π½Π°ΡΠ° ΡΠΈΡΡΠ΅ΠΌΠ° Π·Π° ΡΡΡ
ΡΠ°Π½Π΅Π½ΠΈΠ΅ Π½Π° DC1000M U.2 NVMe ΡΡΡΡΠΎΠΉΡΡΠ²Π°. ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: Kingston
ΠΠ°ΠΊ Π±ΠΈ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π°Π»Π° ΡΠΈΠΏΠΈΡΠ½Π° ΡΠΈΡΡΠ΅ΠΌΠ° Π·Π° HPC ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ° GPUDirect Storage ΠΈΠ»ΠΈ ΠΏΠΎΠ΄ΠΎΠ±Π½Π° ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡ? Π’ΠΎΠ²Π° Π΅ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ° Ρ ΡΠΈΠ·ΠΈΡΠ΅ΡΠΊΠΎ ΡΠ°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π° ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΈ Π΅Π΄ΠΈΠ½ΠΈΡΠΈ Π² ΡΡΠ΅Π»Π°ΠΆ: Π΅Π΄Π½Π° ΠΈΠ»ΠΈ Π΄Π²Π΅ Π΅Π΄ΠΈΠ½ΠΈΡΠΈ Π·Π° RAM, ΠΎΡΠ΅ Π½ΡΠΊΠΎΠ»ΠΊΠΎ Π·Π° GPU ΠΈ CPU ΠΈΠ·ΡΠΈΡΠ»ΠΈΡΠ΅Π»Π½ΠΈ Π²ΡΠ·Π»ΠΈ ΠΈ Π΅Π΄Π½Π° ΠΈΠ»ΠΈ ΠΏΠΎΠ²Π΅ΡΠ΅ Π΅Π΄ΠΈΠ½ΠΈΡΠΈ Π·Π° ΡΠΈΡΡΠ΅ΠΌΠΈ Π·Π° ΡΡΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅.
Π‘ ΠΎΠ±ΡΠ²ΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° GPUDirect Storage ΠΈ Π²ΡΠ·ΠΌΠΎΠΆΠ½Π°ΡΠ° ΠΏΠΎΡΠ²Π° Π½Π° ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΈ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ ΠΎΡ Π΄ΡΡΠ³ΠΈ Π΄ΠΎΡΡΠ°Π²ΡΠΈΡΠΈ Π½Π° GPU, ΡΡΡΡΠ΅Π½Π΅ΡΠΎ Π½Π° Kingston Π·Π° ΡΠΈΡΡΠ΅ΠΌΠΈ Π·Π° ΡΡΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅, ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½ΠΈ Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π²ΡΠ² Π²ΠΈΡΠΎΠΊΠΎΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΈ ΠΈΠ·ΡΠΈΡΠ»Π΅Π½ΠΈΡ, ΡΠ΅ ΡΠ°Π·ΡΠΈΡΡΠ²Π°. ΠΠ°ΡΠΊΠ΅ΡΡΡ ΡΠ΅ Π±ΡΠ΄Π΅ ΡΠΊΠΎΡΠΎΡΡΡΠ° Π½Π° ΡΠ΅ΡΠ΅Π½Π΅ Π½Π° Π΄Π°Π½Π½ΠΈ ΠΎΡ ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ° Π·Π° ΡΡΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅, ΡΡΠ°Π²Π½ΠΈΠΌΠ° Ρ ΠΏΡΠΎΠΏΡΡΠΊΠ°ΡΠ΅Π»Π½Π°ΡΠ° ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ Π½Π° 40- ΠΈΠ»ΠΈ 100-Gbit ΠΌΡΠ΅ΠΆΠΎΠ²ΠΈ ΠΊΠ°ΡΡΠΈ Π½Π° Π²Ρ ΠΎΠ΄Π° Π½Π° ΠΈΠ·ΡΠΈΡΠ»ΠΈΡΠ΅Π»Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡΠ° Ρ GPU. ΠΠΎ ΡΠΎΠ·ΠΈ Π½Π°ΡΠΈΠ½ ΡΠ»ΡΡΠ°Π²ΠΈΡΠΎΠΊΠΎΡΠΊΠΎΡΠΎΡΡΠ½ΠΈΡΠ΅ ΡΠΈΡΡΠ΅ΠΌΠΈ Π·Π° ΡΡΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅, Π²ΠΊΠ»ΡΡΠΈΡΠ΅Π»Π½ΠΎ Π²ΡΠ½ΡΠ΅Π½ NVMe ΡΡΠ΅Π· Fabric, ΡΠ΅ ΡΠ΅ ΠΏΡΠ΅Π²ΡΡΠ½Π°Ρ ΠΎΡ Π΅ΠΊΠ·ΠΎΡΠΈΡΠ½ΠΈ Π² ΠΌΠ΅ΠΉΠ½ΡΡΡΠΈΠΉΠΌ Π·Π° HPC ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. Π Π΄ΠΎΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΡΠΌ Π½Π°ΡΠΊΠ°ΡΠ° ΠΈ ΡΠΈΠ½Π°Π½ΡΠΎΠ²ΠΈΡΠ΅ ΠΈΠ·ΡΠΈΡΠ»Π΅Π½ΠΈΡ, ΡΠ΅ ΡΠ΅ Π½Π°ΠΌΠ΅ΡΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² ΠΌΠ½ΠΎΠ³ΠΎ Π΄ΡΡΠ³ΠΈ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ ΠΎΠ±Π»Π°ΡΡΠΈ, ΠΊΠ°ΡΠΎ Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ ΡΠΈΡΡΠ΅ΠΌΠΈ Π·Π° ΡΠΈΠ³ΡΡΠ½ΠΎΡΡ Π½Π° ΡΡΠΎΠ»ΠΈΡΠ½ΠΎ Π½ΠΈΠ²ΠΎ Π½Π° Safe City ΠΈΠ»ΠΈ ΡΠ΅Π½ΡΡΠΎΠ²Π΅ Π·Π° Π½Π°Π±Π»ΡΠ΄Π΅Π½ΠΈΠ΅ Π½Π° ΡΡΠ°Π½ΡΠΏΠΎΡΡΠ°, ΠΊΡΠ΄Π΅ΡΠΎ ΡΠ΅ ΠΈΠ·ΠΈΡΠΊΠ²Π°Ρ ΡΠΊΠΎΡΠΎΡΡΠΈ Π½Π° ΡΠ°Π·ΠΏΠΎΠ·Π½Π°Π²Π°Π½Π΅ ΠΈ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ Π½Π° ΠΌΠΈΠ»ΠΈΠΎΠ½ΠΈ HD ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ Π² ΡΠ΅ΠΊΡΠ½Π΄Π°β, ΠΎΡΠ΅ΡΡΠ°Ρ Π° ΠΏΠ°Π·Π°ΡΠ½Π°ΡΠ° Π½ΠΈΡΠ° Π½Π° Π½Π°ΠΉ-Π΄ΠΎΠ±ΡΠ°ΡΠ° ΡΠΈΡΡΠ΅ΠΌΠ° Π·Π° ΡΡΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅
ΠΠΎΠ²Π΅ΡΠ΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π·Π° ΠΏΡΠΎΠ΄ΡΠΊΡΠΈΡΠ΅ Π½Π° Kingston ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π½Π°ΠΌΠ΅ΡΠΈΡΠ΅ Π½Π°
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: www.habr.com