שימוש ברוחב פס גבוה יותר ברשת

בדף הזה מוסבר איך ליצור מכונות A2, ‏ G2 ו-N1 שמשתמשות ברוחבי פס גבוהים יותר ברשת. כדי ללמוד איך להשתמש ברוחבי פס גבוהים יותר ברשת עבור סדרות מכונות אחרות שעברו אופטימיזציה לשימוש במאיצים, אפשר לעיין במאמר בנושא יצירת מכונות GPU עם רוחב פס גבוה.

אתם יכולים להשתמש ברוחבי פס גבוהים יותר ברשת, של ‎100 Gbps ומעלה, כדי לשפר את הביצועים של עומסי עבודה מבוזרים שפועלים במכונות וירטואליות עם GPU. רוחבי פס גבוהים יותר ברשת זמינים למכונות וירטואליות מסוג A2,‏ G2 ו-N1 עם כרטיסי GPU מצורפים ב-Compute Engine, באופן הבא:

  • במכונות וירטואליות למטרות כלליות מסוג N1 שמצורפים אליהן יחידות GPU מסוג T4 ו-V100, אפשר לקבל רוחב פס מקסימלי של עד 100 Gbps, בהתאם לשילוב של מספר יחידות ה-GPU ומספר ה-vCPU.
  • במכונות וירטואליות שעברו אופטימיזציה למאיצי A2 ו-G2, אפשר לקבל רוחב פס מקסימלי של עד 100 Gbps, בהתאם לסוג המכונה.

כדי לעיין בהגדרות או בסוגי המכונות שתומכים בשיעורי רוחב פס גבוהים יותר ברשת, אפשר לעיין במאמר בנושא רוחבי פס ברשת ו-GPU.

מידע כללי על רוחב פס ברשת ב-Compute Engine זמין במאמר בנושא רוחב פס ברשת.

סקירה כללית

כדי להשתמש ברוחבי הפס הגבוהים יותר ברשת שזמינים לכל מכונה וירטואלית עם GPU, צריך לבצע את השלבים המומלצים הבאים:

  1. יוצרים מכונת GPU וירטואלית באמצעות תמונת מערכת הפעלה שתומכת בממשק רשת וירטואלי של Google‏ (gVNIC).
  2. אופציונלי: התקנת Fast Socket. התכונה Fast Socket משפרת את הביצועים של NCCL ברשתות של ‎100 Gbps ומעלה, על ידי הפחתת המחלוקת בין כמה חיבורי TCP. חלק מתמונות ה-VM של למידה עמוקה (DLVM) כוללות התקנה מראש של Fast Socket.

שימוש בתמונות VM של למידה עמוקה (Deep Learning)

אפשר ליצור מכונות וירטואליות באמצעות כל תמונה נתמכת של GPU מהפרויקט Deep Learning VM Images. בכל תמונות ה-DLVM שנתמכות על ידי GPU, מנהל ההתקן של ה-GPU, תוכנת ה-ML ו-gVNIC מותקנים מראש. רשימת תמונות DLVM זמינה במאמר בחירת תמונה.

אם רוצים להשתמש ב-Fast Socket, אפשר לבחור תמונת DLVM כמו: tf-latest-gpu-debian-10 או tf-latest-gpu-ubuntu-1804.

יצירת מכונות וירטואליות שמשתמשות ברוחבי פס גבוהים יותר ברשת

אם רוחב הפס של הרשת גבוה, מומלץ להפעיל את Google Virtual NIC ‏ (gVNIC). מידע נוסף זמין במאמר בנושא שימוש בממשק רשת וירטואלי של Google.

כדי ליצור מכונה וירטואלית עם כרטיסי GPU מצורפים ורוחב פס רשת גבוה יותר, מבצעים את הפעולות הבאות:

  1. כדאי לעיין ברוחב הפס המרבי של הרשת שזמין לכל סוג מכונה עם כרטיסי GPU מצורפים.
  2. יוצרים מכונה וירטואלית עם GPU. בדוגמאות הבאות אפשר לראות איך ליצור מכונות A2 ו-N1 עם מכונות VM מסוג V100 שמצורפות אליהן.

    בדוגמאות האלה, מכונות וירטואליות נוצרות באמצעות Google Cloud CLI. עם זאת, אפשר גם להשתמש ב- Google Cloud console או ב-Compute Engine API כדי ליצור את המכונות הווירטואליות האלה. מידע נוסף על יצירת מכונות וירטואליות עם GPU זמין במאמר יצירת מכונה וירטואלית עם GPU מצורף.

    A2 (A100)

    לדוגמה, כדי ליצור מכונת VM עם רוחב פס מקסימלי של 100Gbps, עם שמונה כרטיסי A100 GPU מצורפים, שמשתמשת באימג' של tf-latest-gpu DLVM, מריצים את הפקודה הבאה:

    gcloud compute instances create VM_NAME \
     --project=PROJECT_ID \
     --zone=ZONE \
     --machine-type=a2-highgpu-8g \
     --maintenance-policy=TERMINATE --restart-on-failure \
     --image-family=tf-latest-gpu \
     --image-project=deeplearning-platform-release \
     --boot-disk-size=200GB \
     --network-interface=nic-type=GVNIC \
     --metadata="install-nvidia-driver=True,proxy-mode=project_editors" \
     --scopes=https://www.googleapis.com/auth/cloud-platform
    

    מחליפים את מה שכתוב בשדות הבאים:

    N1 (V100)

    לדוגמה, כדי ליצור מכונה וירטואלית עם רוחב פס מקסימלי של 100Gbps, עם שמונה יחידות GPU מסוג V100 שמצורפות אליה ועם שימוש בתמונה tf-latest-gpu DLVM, מריצים את הפקודה הבאה:

    gcloud compute instances create VM_NAME \
     --project PROJECT_ID \
     --custom-cpu 96 \
     --custom-memory 624 \
     --image-project=deeplearning-platform-release \
     --image-family=tf-latest-gpu \
     --accelerator type=nvidia-tesla-v100,count=8 \
     --maintenance-policy TERMINATE \
     --metadata="install-nvidia-driver=True"  \
     --boot-disk-size 200GB \
     --network-interface=nic-type=GVNIC \
     --zone=ZONE
    
  3. אם אתם לא משתמשים בתמונות של מכונות וירטואליות ללמידה עמוקה עם תמיכה ב-GPU או במערכת הפעלה שמותאמת לקונטיינרים, אתם צריכים להתקין דרייברים של GPU. מידע נוסף זמין במאמר בנושא התקנת דרייברים של GPU.

  4. אופציונלי: במכונה הווירטואלית, מתקינים את Fast Socket.

  5. אחרי שמגדירים את ה-VM, אפשר לאמת את רוחב הפס של הרשת.

התקנת Fast Socket

ספריית התקשורת הקולקטיבית של NVIDIA‏ (NCCL) נמצאת בשימוש במסגרות ללמידה עמוקה כמו TensorFlow,‏ PyTorch ו-Horovod לאימון של כמה GPU ושל כמה צמתים.

‫Fast Socket הוא פרוטוקול העברת נתונים ברשת קנייני של Google ל-NCCL. ב-Compute Engine, ‏ Fast Socket משפר את הביצועים של NCCL ברשתות של 100Gbps על ידי צמצום התחרות בין כמה חיבורי TCP. מידע נוסף על עבודה עם NCCL זמין במדריך למשתמש של NCCL.

ההערכה הנוכחית מראה ש-Fast Socket משפר את קצב העברת הנתונים של פעולות all-reduce ב-30% עד 60%, בהתאם לגודל ההודעה.

כדי להגדיר סביבת Fast Socket, אפשר להשתמש בקובצי אימג' של מכונות וירטואליות ללמידה עמוקה שבהם Fast Socket מותקן מראש, או להתקין את Fast Socket באופן ידני במכונה וירטואלית של Linux. כדי לבדוק אם Fast Socket מותקן מראש, אפשר לעיין במאמר בנושא אימות ההפעלה של Fast Socket.

לפני שמתקינים את Fast Socket במכונת Linux וירטואלית, צריך להתקין את NCCL. הוראות מפורטות זמינות במסמכי NVIDIA NCCL.

‫CentOS/RHEL

כדי להוריד ולהתקין את Fast Socket במכונה וירטואלית של CentOS או RHEL:

  1. מוסיפים את מאגר החבילות ומייבאים מפתחות ציבוריים.

    sudo tee /etc/yum.repos.d/google-fast-socket.repo << EOM
    [google-fast-socket]
    name=Fast Socket Transport for NCCL
    baseurl=https://packages.cloud.google.com/yum/repos/google-fast-socket
    enabled=1
    gpgcheck=0
    repo_gpgcheck=0
    gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg
          https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
    EOM
    
  2. מתקינים את Fast Socket.

    sudo yum install google-fast-socket
    
  3. מוודאים שהאפשרות Fast Socket מופעלת.

SLES

כדי להוריד ולהתקין את Fast Socket במכונה וירטואלית של SLES, מבצעים את השלבים הבאים:

  1. מוסיפים את מאגר החבילות.

    sudo zypper addrepo https://packages.cloud.google.com/yum/repos/google-fast-socket google-fast-socket
    
  2. מוסיפים מפתחות מאגר.

    sudo rpm --import https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
    
  3. מתקינים את Fast Socket.

    sudo zypper install google-fast-socket
    
  4. מוודאים שהאפשרות Fast Socket מופעלת.

‫Debian/Ubuntu

כדי להוריד ולהתקין את Fast Socket במכונת VM של Debian או Ubuntu, מבצעים את השלבים הבאים:

  1. מתקינים את מפתח ה-GPG של המאגר הציבורי ב-/etc/apt/keyrings:

    sudo curl https://packages.cloud.google.com/apt/doc/apt-key.gpg -o /etc/apt/keyrings/google-fast-socket-keyring.gpg
    
  2. מוסיפים את מאגר החבילות:

    echo "deb [signed-by=/etc/apt/keyrings/google-fast-socket-keyring.gpg] https://packages.cloud.google.com/apt google-fast-socket main" | sudo tee /etc/apt/sources.list.d/google-fast-socket.list
    
  3. מתקינים את Fast Socket.

    sudo apt update && sudo apt install google-fast-socket
    
  4. מוודאים שהאפשרות Fast Socket מופעלת.

איך מוודאים ש-Fast Socket מופעל

במכונה הווירטואלית, מבצעים את השלבים הבאים:

  1. מאתרים את ספריית הבית של NCCL.

    sudo ldconfig -p | grep nccl

    לדוגמה, בתמונה של DLVM, הפלט שמתקבל הוא:

    libnccl.so.2 (libc6,x86-64) => /usr/local/nccl2/lib/libnccl.so.2
    libnccl.so (libc6,x86-64) => /usr/local/nccl2/lib/libnccl.so
    libnccl-net.so (libc6,x86-64) => /usr/local/nccl2/lib/libnccl-net.so

    הערך הזה מראה שספריית הבית של NCCL היא /usr/local/nccl2.

  2. בודקים ש-NCCL טוען את הפלאגין Fast Socket. כדי לבדוק, צריך להוריד את חבילת הבדיקה של NCCL. כדי להוריד את חבילת הבדיקה, מריצים את הפקודה הבאה:

    git clone https://github.com/NVIDIA/nccl-tests.git && \
    cd nccl-tests && make NCCL_HOME=NCCL_HOME_DIRECTORY

    מחליפים את NCCL_HOME_DIRECTORY בספריית הבית של NCCL.

  3. מהספרייה nccl-tests, מריצים את התהליך all_reduce_perf:

    NCCL_DEBUG=INFO build/all_reduce_perf

    אם Fast Socket מופעל, ההודעה FastSocket plugin initialized מוצגת ביומן הפלט.

    # nThread 1 nGpus 1 minBytes 33554432 maxBytes 33554432 step: 1048576(bytes) warmup iters: 5 iters: 20 validation: 1
    #
    # Using devices
    #   Rank  0 Pid  63324 on fast-socket-gpu device  0 [0x00] Tesla V100-SXM2-16GB
    .....
    fast-socket-gpu:63324:63324 [0] NCCL INFO NET/FastSocket : Flow placement enabled.
    fast-socket-gpu:63324:63324 [0] NCCL INFO NET/FastSocket : queue skip: 0
    fast-socket-gpu:63324:63324 [0] NCCL INFO NET/FastSocket : Using [0]ens12:10.240.0.24
    fast-socket-gpu:63324:63324 [0] NCCL INFO NET/FastSocket plugin initialized
    ......
    

בדיקת רוחב הפס של הרשת

בקטע הזה מוסבר איך לבדוק את רוחב הפס של הרשת עבור מופעי A3 Mega, ‏ A3 High,‏ A3 Edge, ‏ A2, ‏ G2 ו-N1. כשעובדים עם יחידות GPU עם רוחב פס גבוה, אפשר להשתמש בכלי לתעבורת נתונים ברשת, כמו iperf2, כדי למדוד את רוחב הפס של הרשת.

כדי לבדוק את מהירויות רוחב הפס, צריך לפחות שני מכונות וירטואליות עם כרטיסי GPU מצורפים, ששתיהן יכולות לתמוך במהירות רוחב הפס שאתם בודקים.

משתמשים ב-iPerf כדי לבצע את ההשוואה במערכות מבוססות Debian.

  1. יוצרים שתי מכונות וירטואליות שיכולות לתמוך במהירויות רוחב הפס הנדרשות.

  2. אחרי ששתי המכונות הווירטואליות פועלות, משתמשים ב-SSH כדי להתחבר לאחת מהן.

    gcloud compute ssh VM_NAME \
        --project=PROJECT_ID
    

    מחליפים את מה שכתוב בשדות הבאים:

    • VM_NAME: השם של המכונה הווירטואלית הראשונה
    • PROJECT_ID: מזהה הפרויקט
  3. במכונה הווירטואלית הראשונה, מבצעים את השלבים הבאים:

    1. מתקינים את iperf.

      sudo apt-get update && sudo apt-get install iperf
      
    2. מקבלים את כתובת ה-IP הפנימית של המכונה הווירטואלית. כדאי לרשום את זה כדי לעקוב.

      ip a
      
    3. מפעילים את שרת iPerf.

      iperf -s
      

      הפקודה הזו מפעילה שרת שמקשיב לחיבורים כדי לבצע את הבדיקה. משאירים את הניסוי פועל למשך הבדיקה.

  4. מטרמינל לקוח חדש, מתחברים למכונה הווירטואלית השנייה באמצעות SSH.

    gcloud compute ssh VM_NAME \
       --project=PROJECT_ID
    

    מחליפים את מה שכתוב בשדות הבאים:

    • VM_NAME: השם של המכונה הווירטואלית השנייה
    • PROJECT_ID: מזהה הפרויקט
  5. במכונה הווירטואלית השנייה, מבצעים את השלבים הבאים:

    1. מתקינים את iPerf.

      sudo apt-get update && sudo apt-get install iperf
      
    2. מריצים את בדיקת iperf ומציינים את כתובת ה-IP של המכונה הווירטואלית הראשונה כיעד.

      iperf -t 30 -c internal_ip_of_instance_1 -P 16
      

      הפעולה הזו מריצה בדיקה למשך 30 שניות ומפיקה תוצאה שדומה לפלט הבא. אם iPerf לא מצליח להגיע למכונה הווירטואלית השנייה, יכול להיות שתצטרכו לשנות את הרשת או את הגדרות חומת האש במכונות הווירטואליות, או אולי במסוף Google Cloud .

כשמשתמשים ברוחב הפס המקסימלי הזמין של 100Gbps או 1000Gbps (A3 Mega,‏ A3 High או A3 Edge), חשוב לזכור את הנקודות הבאות:

  • בגלל התקורה של כותרות חבילות בפרוטוקולים של רשתות כמו Ethernet,‏ IP ו-TCP במערך הווירטואליזציה, קצב העברת הנתונים, כפי שנמדד על ידי netperf, מגיע לרוויה בסביבות 90‎ Gbps או 800‎ Gbps (A3 Mega,‏ A3 High או A3 Edge). המדד הזה נקרא בדרך כלל goodput.

    פרוטוקול TCP יכול להשיג מהירות רשת של 100 או 1,000‎ Gbps. פרוטוקולים אחרים, כמו UDP, הם איטיים יותר.

  • בגלל גורמים כמו תקורה של פרוטוקול ועומס ברשת, הביצועים מקצה לקצה של זרמי נתונים עשויים להיות נמוכים יותר.

  • כדי להשיג רוחב פס מקסימלי בין מכונות VM, צריך להשתמש בכמה זרמי TCP. ‫Google ממליצה על 4 עד 16 זרמים. ב-16 זרימות, תהיה לכם אפשרות למקסם את קצב העברת הנתונים. יכול להיות שתצטרכו לשנות את ההגדרות של האפליקציה או של הקוד כדי להגדיר כמה זרמים, בהתאם לאפליקציה ולחבילת התוכנה שלכם.

מה השלב הבא?