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

בדף הזה מוסבר איך ליצור מכונות מסוג 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 Virtual NIC ‏ (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. עם זאת, אפשר גם להשתמש ב- Cloud de Confiance console או ב-Compute Engine API כדי ליצור את מכונות ה-VM האלה. מידע נוסף על יצירת מכונות וירטואליות עם GPU זמין במאמר יצירת מכונה וירטואלית עם GPU מצורף.

    A2 (A100)

    לדוגמה, כדי ליצור מכונת VM עם רוחב פס מקסימלי של 100 Gbps, עם שמונה יחידות GPU מסוג A100 שמחוברות אליה, ועם שימוש באימג' של 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)

    לדוגמה, כדי ליצור מכונה וירטואלית עם רוחב פס מקסימלי של 100 Gbps, עם שמונה כרטיסי V100 GPU שמצורפים אליה ועם שימוש בתמונה 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. אם אתם לא משתמשים בתמונות VM של למידה עמוקה (Deep Learning) עם תמיכה ב-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 ברשתות של 100 Gbps על ידי צמצום התחרות בין כמה חיבורי TCP. מידע נוסף על עבודה עם NCCL זמין במדריך למשתמש של NCCL.

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

כדי להגדיר סביבת Fast Socket, אפשר להשתמש ב-Deep Learning VM Images שמותקן בה 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
    ......
    

השוואת הביצועים של קמפיינים עם יעד עלות להמרה

כשמבצעים אופטימיזציה של ביצועי GPU לעומסי עבודה מבוזרים, חשוב לבצע השוואה בין ביצועים של NVIDIA Collective Communications Library (NCCL). הביצועים של NCCL נמדדים לפי רוחב פס של האוטובוס (busbw), בדרך כלל באמצעות בדיקת all_reduce_perf.

ביצועים צפויים של NCCL במכונות וירטואליות מסוג A3 High ו-A3 Mega

בטבלה הבאה מפורטים מדדי רוחב הפס הצפויים של NCCL bus למכונות וירטואליות מסוג A3 High ו-A3 Mega בבדיקה של שני צמתים שבהם גודל ההודעה הוא 1GB עד 8GB.

סוג המכונה מספר הצמתים רוחב פס צפוי של האוטובוס (GBps) all_reduce_perf
A3 High 2 ‫> 80 GBps
A3+ Mega 2 ‫> 160 GBps

ככל שמוסיפים עוד מכונות וירטואליות לפעולה הקולקטיבית, רוחב הפס של האוטובוס בדרך כלל יורד. לדוגמה, יכול להיות שקלאסטר A3+ עם 4 צמתים ישיג מהירות של 130-140 GBps.

הרצת בדיקת ביצועים של NCCL all-reduce

כדי להריץ את מדד ההשוואה all_reduce_perf בכמה צמתים, משתמשים ב-mpirun.

  1. צריך לוודא שמתקיימות הדרישות המוקדמות הבאות:

    • בכל צומת, מורידים ומקמפלים את nccl-tests. מידע נוסף זמין במאמר בנושא אימות ההפעלה של Fast Socket.
    • יוצרים hostfile, מפרטים את הצמתים ומציינים 8 יחידות GPU לכל צומת.

    קובץ hostfile הוא קובץ טקסט שמציין ל-mpirun אילו צמתים להשתמש וכמה תהליכים להריץ בכל צומת. כדי ליצור קובץ כזה, יוצרים קובץ טקסט בספריית העבודה שבו מפורט כל צומת בשורה נפרדת, עם שם המארח או כתובת ה-IP, ואחריהם slots=8. לדוגמה, כדי ליצור קובץ host בשם my-hostfile לצמתים node-1 ו-node-2, מוסיפים את השורות הבאות לקובץ my-hostfile:

    node-1 slots=8
    node-2 slots=8
    
  2. מריצים את הבדיקה. הפקודה הבאה מריצה את הבדיקה all-reduce-perf בשני צמתים, עם 16 תהליכים בסך הכול.

    mpirun -x LD_LIBRARY_PATH --hostfile HOSTFILE_NAME \
    -n 16 ./build/all_reduce_perf -b 1G -e 8G -f 2 -g 8
    

    מחליפים את HOSTFILE_NAME בשם של hostfile שיצרתם בשלב הקודם. לדוגמה, my-hostfile.

    • -n 16: המספר הכולל של תהליכי MPI, שמחושב כמספר הצמתים כפול מספר יחידות ה-GPU לכל צומת.
    • -b 1G -e 8G: טווח גדלים להודעה.
    • -f 2: מכפיל לגודל ההודעה בכל שלב.
    • -g 8: מספר יחידות ה-GPU לכל תהליך.

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

בקטע הזה מוסבר איך לבדוק את רוחב הפס של הרשת עבור מכונות וירטואליות מסוג 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 לא מצליח להגיע למכונה הווירטואלית השנייה, יכול להיות שתצטרכו לשנות את הרשת או את הגדרות חומת האש במכונות הווירטואליות או במסוף Cloud de Confiance .

כשמשתמשים ברוחב הפס המקסימלי הזמין של 100 Gbps או 1,000 Gbps (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, הם איטיים יותר.

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

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

מה השלב הבא?