SAX ב-Cloud TPU v5e
אשכול SAX (תא SAX)
שרת האדמין של SAX ושרת המודל של SAX הם שני רכיבים חיוניים שמופעלים באשכול SAX.
שרת אדמין של SAX
שרת האדמין של SAX מנטר ומתאם את כל שרתי המודלים של SAX באשכול SAX. ב-SAX cluster, אפשר להפעיל כמה שרתי אדמין של SAX, אבל רק אחד מהם פעיל באמצעות בחירת מנהיג. השרתים האחרים הם שרתי המתנה. אם שרת האדמין הפעיל נכשל, שרת אדמין במצב המתנה יהפוך לפעיל. שרת האדמין הפעיל של SAX מקצה רפליקות של מודלים ובקשות הסקה לשרתי מודלים זמינים של SAX.
קטגוריית אחסון של אדמין SAX
כל אשכול SAX צריך קטגוריה של Cloud Storage כדי לאחסן את ההגדרות והמיקומים של שרתי האדמין ושרתי המודל של SAX באשכול SAX.
שרת מודל SAX
שרת המודלים של SAX טוען נקודת ביקורת של מודל ומריץ הסקה באמצעות GSPMD. שרת מודל SAX פועל במכונת עבודה וירטואלית אחת של TPU. פרסום מודל TPU במארח יחיד דורש שרת מודל SAX יחיד במכונה וירטואלית של TPU במארח יחיד. פרסום מודל TPU בכמה מארחים דורש קבוצה של שרתי מודלים של SAX בפרוסת TPU בכמה מארחים. בשלב הזה אין אפשרות להפעיל מודל בכמה מארחים, אבל במסמך הזה יש דוגמה עם מודל בדיקה של 175 מיליארד פרמטרים בגרסת טרום-השקה (Preview).
פרסום מודל SAX
בקטע הבא מפורט תהליך העבודה להצגת מודלים של שפה באמצעות SAX. הוא משתמש במודל GPT-J 6B כדוגמה להצגת מודל של מארח יחיד.
לפני שמתחילים, צריך להתקין את תמונות ה-Docker של Cloud TPU SAX במכונת ה-TPU VM:
sudo usermod -a -G docker ${USER} newgrp docker gcloud auth configure-docker us-docker.pkg.dev SAX_ADMIN_SERVER_IMAGE_NAME="us-docker.pkg.dev/cloud-tpu-images/inference/sax-admin-server" SAX_MODEL_SERVER_IMAGE_NAME="us-docker.pkg.dev/cloud-tpu-images/inference/sax-model-server" SAX_UTIL_IMAGE_NAME="us-docker.pkg.dev/cloud-tpu-images/inference/sax-util" SAX_VERSION=v1.0.0 export SAX_ADMIN_SERVER_IMAGE_URL=${SAX_ADMIN_SERVER_IMAGE_NAME}:${SAX_VERSION} export SAX_MODEL_SERVER_IMAGE_URL=${SAX_MODEL_SERVER_IMAGE_NAME}:${SAX_VERSION} export SAX_UTIL_IMAGE_URL="${SAX_UTIL_IMAGE_NAME}:${sax_version}" docker pull ${SAX_ADMIN_SERVER_IMAGE_URL} docker pull ${SAX_MODEL_SERVER_IMAGE_URL} docker pull ${SAX_UTIL_IMAGE_URL}
מגדירים עוד משתנים שישמשו אתכם בהמשך:
export SAX_ADMIN_SERVER_DOCKER_NAME="sax-admin-server" export SAX_MODEL_SERVER_DOCKER_NAME="sax-model-server" export SAX_CELL="/sax/test"
דוגמה לפרסום מודל GPT-J 6B במארח יחיד
פרסום מודל במארח יחיד רלוונטי לפרוסת TPU במארח יחיד, כלומר v5litepod-1, v5litepod-4 ו-v5litepod-8.
יצירת אשכול SAX
יוצרים קטגוריית אחסון ב-Cloud Storage עבור אשכול SAX:
SAX_ADMIN_STORAGE_BUCKET=${your_admin_storage_bucket} gcloud storage buckets create gs://${SAX_ADMIN_STORAGE_BUCKET} \ --project=${PROJECT_ID}
יכול להיות שתצטרכו עוד קטגוריית אחסון ב-Cloud Storage כדי לאחסן את נקודת הבדיקה.
SAX_DATA_STORAGE_BUCKET=${your_data_storage_bucket}
מתחברים ב-SSH למכונת ה-TPU הווירטואלית בטרמינל כדי להפעיל את שרת האדמין של SAX:
docker run \ --name ${SAX_ADMIN_SERVER_DOCKER_NAME} \ -it \ -d \ --rm \ --network host \ --env GSBUCKET=${SAX_ADMIN_STORAGE_BUCKET} \ ${SAX_ADMIN_SERVER_IMAGE_URL}
כדי לבדוק את יומן הרישום של Docker:
docker logs -f ${SAX_ADMIN_SERVER_DOCKER_NAME}
הפלט ביומן ייראה כך:
I0829 01:22:31.184198 7 config.go:111] Creating config fs_root: "gs://test_sax_admin/sax-fs-root" I0829 01:22:31.347883 7 config.go:115] Created config fs_root: "gs://test_sax_admin/sax-fs-root" I0829 01:22:31.360837 24 admin_server.go:44] Starting the server I0829 01:22:31.361420 24 ipaddr.go:39] Skipping non-global IP address 127.0.0.1/8. I0829 01:22:31.361455 24 ipaddr.go:39] Skipping non-global IP address ::1/128. I0829 01:22:31.361462 24 ipaddr.go:39] Skipping non-global IP address fe80::4001:aff:fe8e:fc8/64. I0829 01:22:31.361469 24 ipaddr.go:39] Skipping non-global IP address fe80::42:bfff:fef9:1bd3/64. I0829 01:22:31.361474 24 ipaddr.go:39] Skipping non-global IP address fe80::20fb:c3ff:fe5b:baac/64. I0829 01:22:31.361482 24 ipaddr.go:56] IPNet address 10.142.15.200 I0829 01:22:31.361488 24 ipaddr.go:56] IPNet address 172.17.0.1 I0829 01:22:31.456952 24 admin.go:305] Loaded config: fs_root: "gs://test_sax_admin/sax-fs-root" I0829 01:22:31.609323 24 addr.go:105] SetAddr /gcs/test_sax_admin/sax-root/sax/test/location.proto "10.142.15.200:10000" I0829 01:22:31.656021 24 admin.go:325] Updated config: fs_root: "gs://test_sax_admin/sax-fs-root" I0829 01:22:31.773245 24 mgr.go:781] Loaded manager state I0829 01:22:31.773260 24 mgr.go:784] Refreshing manager state every 10s I0829 01:22:31.773285 24 admin.go:350] Starting the server on port 10000 I0829 01:22:31.773292 24 cloud.go:506] Starting the HTTP server on port 8080
מפעילים שרת מודל SAX עם מארח יחיד באשכול SAX:
בשלב הזה, אשכול ה-SAX מכיל רק את שרת האדמין של ה-SAX. אתם יכולים להתחבר למכונת ה-TPU הווירטואלית באמצעות SSH בטרמינל שני כדי להפעיל שרת מודלים של SAX באשכול SAX:
docker run \ --privileged \ -it \ -d \ --rm \ --network host \ --name ${SAX_MODEL_SERVER_DOCKER_NAME} \ --env SAX_ROOT=gs://${SAX_ADMIN_STORAGE_BUCKET}/sax-root \ ${SAX_MODEL_SERVER_IMAGE_URL} \ --sax_cell=${SAX_CELL} \ --port=10001 \ --platform_chip=tpuv4 \ --platform_topology=1x1
המרת נקודת ביקורת של מודל:
כדי להוריד את נקודת הבדיקה של GPT-J מ-EleutherAI, צריך להתקין את PyTorch ואת Transformers:
pip3 install accelerate pip3 install torch pip3 install transformers
כדי להמיר את נקודת הבדיקה לנקודת בדיקה של SAX, צריך להתקין את
paxml:pip3 install paxml==1.1.0
הסקריפט הבא ממיר את נקודת הבדיקה של GPT-J לנקודת בדיקה של SAX:
python3 -m convert_gptj_ckpt --base EleutherAI/gpt-j-6b --pax pax_6b
אחרי שההמרה מסתיימת:
ls checkpoint_00000000/צריך ליצור קובץ commit_success ולמקם אותו בספריות המשנה:
gcloud storage cp checkpoint_00000000 ${CHECKPOINT_PATH} --recursive touch commit_success.txt gcloud storage cp commit_success.txt ${CHECKPOINT_PATH}/ gcloud storage cp commit_success.txt ${CHECKPOINT_PATH}/metadata/ gcloud storage cp commit_success.txt ${CHECKPOINT_PATH}/state/פרסום המודל באשכול SAX
עכשיו אפשר לפרסם את GPT-J עם נקודת הבדיקה שהומרה בשלב הקודם.
MODEL_NAME=gptjtokenizedbf16bs32 MODEL_CONFIG_PATH=saxml.server.pax.lm.params.gptj.GPTJ4TokenizedBF16BS32 REPLICA=1
כדי לפרסם את GPT-J (ואת השלבים הבאים), משתמשים ב-SSH כדי להתחבר למכונת ה-TPU הווירטואלית בטרמינל השלישי:
docker run \ ${SAX_UTIL_IMAGE_URL} \ --sax_root=gs://${SAX_ADMIN_STORAGE_BUCKET}/sax-root \ publish \ ${SAX_CELL}/${MODEL_NAME} \ ${MODEL_CONFIG_PATH} \ ${CHECKPOINT_PATH} \ ${REPLICA}
תראו הרבה פעילות ביומן Docker של שרת המודל, עד שתראו משהו כמו הדוגמה הבאה שמציין שהמודל נטען בהצלחה:
I0829 01:33:49.287459 139865140229696 servable_model.py:697] loading completed.
יצירת תוצאות של הסקה
ב-GPT-J, הקלט והפלט צריכים להיות בפורמט של מחרוזת מזהי טוקנים מופרדת בפסיקים. תצטרכו ליצור טוקניזציה של קלט הטקסט.
TEXT = "Below is an instruction that describes a task, paired with an input that provides further context. Write a response that appropriately completes the request.\n\n### Instruction\:\nSummarize the following news article\:\n\n### Input\:\nMarch 10, 2015 . We're truly international in scope on Tuesday. We're visiting Italy, Russia, the United Arab Emirates, and the Himalayan Mountains. Find out who's attempting to circumnavigate the globe in a plane powered partially by the sun, and explore the mysterious appearance of craters in northern Asia. You'll also get a view of Mount Everest that was previously reserved for climbers. On this page you will find today's show Transcript and a place for you to request to be on the CNN Student News Roll Call. TRANSCRIPT . Click here to access the transcript of today's CNN Student News program. Please note that there may be a delay between the time when the video is available and when the transcript is published. CNN Student News is created by a team of journalists who consider the Common Core State Standards, national standards in different subject areas, and state standards when producing the show. ROLL CALL . For a chance to be mentioned on the next CNN Student News, comment on the bottom of this page with your school name, mascot, city and state. We will be selecting schools from the comments of the previous show. You must be a teacher or a student age 13 or older to request a mention on the CNN Student News Roll Call! Thank you for using CNN Student News!\n\n### Response\:
אפשר לקבל את מחרוזת מזהי האסימונים באמצעות tokenizer של EleutherAI/gpt-j-6b:
from transformers import GPT2Tokenizer tokenizer = GPT2Tokenizer.from_pretrained("EleutherAI/gpt-j-6b") :
פיצול טקסט הקלט לטוקנים:
encoded_example = tokenizer(TEXT) input_ids = encoded_example.input_ids INPUT_STR = ",".join([str(input_id) for input_id in input_ids])
מחרוזת של מזהה אסימון שנראית בערך כך:
>>> INPUT_STR '21106,318,281,12064,326,8477,257,4876,11,20312,351,281,5128,326,3769,2252,4732,13,19430,257,2882,326,20431,32543,262,2581,13,198,198,21017,46486,25,198,13065,3876,1096,262,1708,1705,2708,25,198,198,21017,23412,25,198,16192,838,11,1853,764,775,821,4988,3230,287,8354,319,3431,13,775,821,10013,8031,11,3284,11,262,1578,4498,24880,11,290,262,42438,22931,21124,13,9938,503,508,338,9361,284,2498,4182,615,10055,262,13342,287,257,6614,13232,12387,416,262,4252,11,290,7301,262,11428,5585,286,1067,8605,287,7840,7229,13,921,1183,635,651,257,1570,286,5628,41336,326,373,4271,10395,329,39311,13,1550,428,2443,345,481,1064,1909,338,905,42978,290,257,1295,329,345,284,2581,284,307,319,262,8100,13613,3000,8299,4889,13,48213,6173,46023,764,6914,994,284,1895,262,14687,286,1909,338,8100,13613,3000,1430,13,4222,3465,326,612,743,307,257,5711,1022,262,640,618,262,2008,318,1695,290,618,262,14687,318,3199,13,8100,13613,3000,318,2727,416,257,1074,286,9046,508,2074,262,8070,7231,1812,20130,11,2260,5423,287,1180,2426,3006,11,290,1181,5423,618,9194,262,905,13,15107,3069,42815,764,1114,257,2863,284,307,4750,319,262,1306,8100,13613,3000,11,2912,319,262,4220,286,428,2443,351,534,1524,1438,11,37358,11,1748,290,1181,13,775,481,307,17246,4266,422,262,3651,286,262,2180,905,13,921,1276,307,257,4701,393,257,3710,2479,1511,393,4697,284,2581,257,3068,319,262,8100,13613,3000,8299,4889,0,6952,345,329,1262,8100,13613,3000,0,198,198,21017,18261,25'
כדי ליצור סיכום של המאמר:
docker run \ ${SAX_UTIL_IMAGE_URL} \ --sax_root=gs://${SAX_ADMIN_STORAGE_BUCKET}/sax-root \ lm.generate \ ${SAX_CELL}/${MODEL_NAME} \ ${INPUT_STR}התוצאה תהיה דומה לזו:
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------+ | GENERATE | SCORE | +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------+ | 1212,2443,3407,262,905,42978,764,198,11041,262,42978,284,1037,2444,351,3555,35915,290,25818,764,198,2953,262,4220,286,262,2443,11,2912,329,257,2863,284,307,4750,319,8100,13613,3000,13,220,921,1276,307,257,4701,393,257,3710,2479,1511,393,4697,284,2581,257,3068,319,262,8100,13613,3000,8299,4889,13,50256 | -0.023136413 | | 1212,2443,3407,262,905,42978,764,198,11041,262,42978,284,1037,2444,351,3555,35915,290,25818,764,198,2953,262,4220,286,262,2443,11,2912,329,257,2863,284,307,4750,319,8100,13613,3000,13,220,921,1276,307,257,4701,393,257,3710,2479,1511,393,4697,284,2581,257,3068,319,262,8100,13613,3000,8299,4889,0,50256 | -0.91842502 | | 1212,2443,3407,262,905,42978,764,198,11041,262,42978,284,1037,2444,351,3555,35915,290,25818,764,198,2953,262,4220,286,262,2443,11,2912,329,257,2863,284,307,4750,319,8100,13613,3000,13,921,1276,307,257,4701,393,257,3710,2479,1511,393,4697,284,2581,257,3068,319,262,8100,13613,3000,8299,4889,13,50256 | -1.1726116 | | 1212,2443,3407,262,905,42978,764,198,11041,262,42978,284,1037,2444,351,3555,35915,290,25818,764,198,2953,262,4220,286,262,2443,11,2912,329,257,2863,284,307,4750,319,8100,13613,3000,13,220,921,1276,307,1511,393,4697,284,2581,257,3068,319,262,8100,13613,3000,8299,4889,13,50256 | -1.2472695 | +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------+
כדי לבטל את הטוקניזציה של מחרוזת מזהי הטוקנים של הפלט:
output_token_ids = [int(token_id) for token_id in OUTPUT_STR.split(',')] OUTPUT_TEXT = tokenizer.decode(output_token_ids, skip_special_tokens=True)הטקסט שיוחזר אחרי ההסרה של הטוקנים יהיה:
>>> OUTPUT_TEXT 'This page includes the show Transcript.\nUse the Transcript to help students with reading comprehension and vocabulary.\nAt the bottom of the page, comment for a chance to be mentioned on CNN Student News. You must be a teacher or a student age 13 or older to request a mention on the CNN Student News Roll Call.'
מפנים נפח אחסון בקונטיינרים של Docker ובקטגוריות של Cloud Storage.
תצוגה מקדימה של פרסום מודל עם 175 מיליארד פרמטרים בכמה מארחים
חלק מהמודלים הגדולים של שפה ידרשו פרוסת TPU מרובת מארחים, כלומר, v5litepod-16 ומעלה. במקרים כאלה, כל מארחי ה-TPU מרובי המארחים יצטרכו להכיל עותק של שרת מודל SAX, וכל שרתי המודל יפעלו כקבוצת שרתי מודל SAX כדי להציג את המודל הגדול בפרוסת TPU מרובת מארחים.
יצירת אשכול SAX חדש
אפשר לפעול לפי השלב 'יצירת אשכול SAX' בהמדריך ל-GPT-J כדי ליצור אשכול SAX חדש ושרת אדמין SAX.
לחלופין, אם כבר יש לכם אשכול SAX, אתם יכולים להפעיל שרת מודלים מרובה מארחים באשכול SAX.
הפעלת שרת מודלים של SAX מרובה מארחים באשכול SAX
משתמשים באותה פקודה שבה משתמשים כדי ליצור פלח TPU במארח יחיד, רק מציינים את סוג המאיץ המתאים למארחים מרובים:
ACCELERATOR_TYPE=v5litepod-32 ZONE=us-east1-c gcloud alpha compute tpus queued-resources create ${QUEUED_RESOURCE_ID} \ --node-id ${TPU_NAME} \ --project ${PROJECT_ID} \ --zone ${ZONE} \ --accelerator-type ${ACCELERATOR_TYPE} \ --runtime-version ${RUNTIME_VERSION} \ --service-account ${SERVICE_ACCOUNT} \ --reservedכדי למשוך את תמונת השרת של מודל SAX לכל המארחים או העובדים של TPU ולהפעיל אותם:
gcloud compute tpus tpu-vm ssh ${TPU_NAME} \ --project ${PROJECT_ID} \ --zone ${ZONE} \ --worker=all \ --command=" gcloud auth configure-docker \ us-docker.pkg.dev # Pull sax model server image docker pull ${SAX_MODEL_SERVER_IMAGE_URL} # Run model server docker run \ --privileged \ -it \ -d \ --rm \ --network host \ --name ${SAX_MODEL_SERVER_DOCKER_NAME} \ --env SAX_ROOT=gs://${SAX_ADMIN_STORAGE_BUCKET}/sax-root \ ${SAX_MODEL_SERVER_IMAGE_URL} \ --sax_cell=${SAX_CELL} \ --port=10001 \ --platform_chip=tpuv4 \ --platform_topology=1x1"פרסום המודל באשכול SAX
בדוגמה הזו נעשה שימוש במודל LmCloudSpmd175B32Test:
MODEL_NAME=lmcloudspmd175b32test MODEL_CONFIG_PATH=saxml.server.pax.lm.params.lm_cloud.LmCloudSpmd175B32Test CHECKPOINT_PATH=None REPLICA=1
כדי לפרסם את מודל הבדיקה:
docker run \ ${SAX_UTIL_IMAGE_URL} \ --sax_root=gs://${SAX_ADMIN_STORAGE_BUCKET}/sax-root \ publish \ ${SAX_CELL}/${MODEL_NAME} \ ${MODEL_CONFIG_PATH} \ ${CHECKPOINT_PATH} \ ${REPLICA}
יצירת תוצאות של הסקה
docker run \ ${SAX_UTIL_IMAGE_URL} \ --sax_root=gs://${SAX_ADMIN_STORAGE_BUCKET}/sax-root \ lm.generate \ ${SAX_CELL}/${MODEL_NAME} \ "Q: Who is Harry Porter's mother? A\: "שימו לב: בדוגמה הזו נעשה שימוש במודל בדיקה עם משקלים אקראיים, ולכן יכול להיות שהפלט לא יהיה משמעותי.
הסרת המשאבים
עוצרים את קונטיינרים של Docker:
docker stop ${SAX_ADMIN_SERVER_DOCKER_NAME} docker stop ${SAX_MODEL_SERVER_DOCKER_NAME}
כדי למחוק את קטגוריית האחסון של האדמין ב-Cloud Storage וכל קטגוריית אחסון נתונים, משתמשים ב-CLI של gcloud כמו בדוגמה שלמטה.
gcloud storage rm gs://${SAX_ADMIN_STORAGE_BUCKET} --recursive --continue-on-error gcloud storage rm gs://${SAX_DATA_STORAGE_BUCKET} --recursive --continue-on-error