SAX no Cloud TPU v5e
Cluster SAX (célula SAX)
O servidor de administração SAX e o servidor de modelos SAX são dois componentes essenciais que executam um cluster SAX.
Servidor de administração do SAX
O servidor de administração do SAX monitoriza e coordena todos os servidores de modelos do SAX num cluster do SAX. Num cluster SAX, pode iniciar vários servidores de administração SAX, em que apenas um dos servidores de administração SAX está ativo através da eleição de líder. Os outros são servidores em espera. Quando o servidor de administração ativo falha, um servidor de administração em espera torna-se ativo. O servidor de administração do SAX ativo atribui réplicas de modelos e pedidos de inferência aos servidores de modelos do SAX disponíveis.
Contentor de armazenamento do administrador do SAX
Cada cluster SAX requer um contentor do Cloud Storage para armazenar as configurações e as localizações dos servidores de administração do SAX e dos servidores de modelos do SAX no cluster SAX.
Servidor do modelo SAX
O servidor de modelos SAX carrega um ponto de verificação do modelo e executa a inferência com o GSPMD. Um servidor de modelo SAX é executado num único worker de VM de TPU. O serviço de modelos de TPU de anfitrião único requer um servidor de modelos SAX num VM de TPU de anfitrião único. A publicação de modelos de TPUs com vários anfitriões requer um grupo de servidores de modelos SAX numa fatia de TPUs com vários anfitriões. A publicação de modelos com vários anfitriões não está atualmente disponível, mas este documento fornece um exemplo com um modelo de teste de 175 mil milhões de parâmetros para pré-visualização.
Publicação do modelo SAX
A secção seguinte explica o fluxo de trabalho para publicar modelos de linguagem usando o SAX. Usa o modelo GPT-J 6B como exemplo para a publicação de modelos de anfitrião único.
Antes de começar, instale as imagens Docker do SAX da Cloud TPU na sua VM da TPU:
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}
Defina outras variáveis que vai usar mais tarde:
export SAX_ADMIN_SERVER_DOCKER_NAME="sax-admin-server" export SAX_MODEL_SERVER_DOCKER_NAME="sax-model-server" export SAX_CELL="/sax/test"
Exemplo de publicação de modelo de anfitrião único GPT-J 6B
O serviço do modelo de anfitrião único é aplicável à fatia de TPU de anfitrião único, ou seja, v5litepod-1, v5litepod-4 e v5litepod-8.
Crie um cluster SAX
Crie um contentor de armazenamento do Cloud Storage para o cluster SAX:
SAX_ADMIN_STORAGE_BUCKET=${your_admin_storage_bucket} gcloud storage buckets create gs://${SAX_ADMIN_STORAGE_BUCKET} \ --project=${PROJECT_ID}
Pode precisar de outro contentor de armazenamento do Cloud Storage para armazenar o ponto de verificação.
SAX_DATA_STORAGE_BUCKET=${your_data_storage_bucket}
Execute o SSH na VM de TPU num terminal para iniciar o servidor de administração do 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}
Pode verificar o registo do Docker da seguinte forma:
docker logs -f ${SAX_ADMIN_SERVER_DOCKER_NAME}
O resultado no registo tem um aspeto semelhante ao seguinte:
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
Inicie um servidor de modelos SAX de anfitrião único no cluster SAX:
Neste momento, o cluster SAX contém apenas o servidor de administração SAX. Pode estabelecer ligação à VM da TPU através de SSH num segundo terminal para iniciar um servidor de modelos SAX no seu cluster 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
Converter controlo de segurança do modelo:
Tem de instalar o PyTorch e o Transformers para transferir o ponto de verificação do GPT-J da EleutherAI:
pip3 install accelerate pip3 install torch pip3 install transformers
Para converter o ponto de verificação no ponto de verificação SAX, tem de instalar o seguinte:
paxmlpip3 install paxml==1.1.0
O seguinte script converte o ponto de verificação GPT-J no ponto de verificação SAX:
python3 -m convert_gptj_ckpt --base EleutherAI/gpt-j-6b --pax pax_6b
Após a conversão:
ls checkpoint_00000000/Tem de criar um ficheiro commit_success e colocá-lo nos subdiretórios:
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/Publique o modelo no cluster SAX
Agora, pode publicar o GPT-J com o ponto de verificação convertido no passo anterior.
MODEL_NAME=gptjtokenizedbf16bs32 MODEL_CONFIG_PATH=saxml.server.pax.lm.params.gptj.GPTJ4TokenizedBF16BS32 REPLICA=1
Para publicar o GPT-J (e os passos seguintes), use o SSH para estabelecer ligação à sua VM de TPU num terceiro terminal:
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}
Vai ver muita atividade no registo do Docker do servidor do modelo até ver algo semelhante ao seguinte para indicar que o modelo foi carregado com êxito:
I0829 01:33:49.287459 139865140229696 servable_model.py:697] loading completed.
Gere resultados de inferência
Para o GPT-J, a entrada e a saída têm de ser formatadas como uma string de ID de token separada por vírgulas. Tem de tokenizar a entrada de texto.
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\:
Pode obter a string de IDs dos tokens através do tokenizador EleutherAI/gpt-j-6b:
from transformers import GPT2Tokenizer tokenizer = GPT2Tokenizer.from_pretrained("EleutherAI/gpt-j-6b") :
Tokenizar o texto de entrada:
encoded_example = tokenizer(TEXT) input_ids = encoded_example.input_ids INPUT_STR = ",".join([str(input_id) for input_id in input_ids])
Pode esperar uma string de ID de token semelhante à seguinte:
>>> 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'
Para gerar um resumo do seu artigo:
docker run \ ${SAX_UTIL_IMAGE_URL} \ --sax_root=gs://${SAX_ADMIN_STORAGE_BUCKET}/sax-root \ lm.generate \ ${SAX_CELL}/${MODEL_NAME} \ ${INPUT_STR}Pode esperar algo semelhante ao seguinte:
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------+ | 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 | +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------+
Para remover a tokenização da string de IDs de tokens de saída:
output_token_ids = [int(token_id) for token_id in OUTPUT_STR.split(',')] OUTPUT_TEXT = tokenizer.decode(output_token_ids, skip_special_tokens=True)Pode esperar o texto sem tokens da seguinte forma:
>>> 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.'
Limpe os contentores Docker e os contentores de armazenamento do Cloud Storage.
Pré-visualização da publicação de modelos multi-host de 175 mil milhões de parâmetros
Alguns dos modelos de linguagem (conteúdo extenso) vão exigir uma fatia de TPU com vários anfitriões, ou seja, v5litepod-16 e superior. Nesses casos, todos os anfitriões de TPU com vários anfitriões têm de ter uma cópia de um servidor de modelos SAX e todos os servidores de modelos funcionam como um grupo de servidores de modelos SAX para publicar o modelo grande numa fatia de TPU com vários anfitriões.
Crie um novo cluster SAX
Pode seguir o mesmo passo de criação de um cluster SAX no tutorial do GPT-J para criar um novo cluster SAX e um servidor de administração do SAX.
Em alternativa, se já tiver um cluster SAX, pode iniciar um servidor de modelos com vários anfitriões no cluster SAX.
Inicie um servidor de modelos SAX com vários anfitriões num cluster SAX
Use o mesmo comando para criar uma fatia de TPU multi-anfitrião que usa para uma fatia de TPU de anfitrião único. Basta especificar o tipo de acelerador multi-anfitrião adequado:
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} \ --reservedPara extrair a imagem do servidor do modelo SAX para todos os anfitriões/trabalhadores da TPU e iniciá-los:
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"Publique o modelo no cluster SAX
Este exemplo usa um modelo LmCloudSpmd175B32Test:
MODEL_NAME=lmcloudspmd175b32test MODEL_CONFIG_PATH=saxml.server.pax.lm.params.lm_cloud.LmCloudSpmd175B32Test CHECKPOINT_PATH=None REPLICA=1
Para publicar o modelo de teste:
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}
Gere resultados de inferência
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\: "Tenha em atenção que, uma vez que este exemplo usa um modelo de teste com ponderações aleatórias, o resultado pode não ser significativo.
Limpar
Pare os contentores do Docker:
docker stop ${SAX_ADMIN_SERVER_DOCKER_NAME} docker stop ${SAX_MODEL_SERVER_DOCKER_NAME}
Elimine o seu segmento de armazenamento de administrador do Cloud Storage e qualquer segmento de armazenamento de dados através da CLI gcloud, conforme mostrado abaixo.
gcloud storage rm gs://${SAX_ADMIN_STORAGE_BUCKET} --recursive --continue-on-error gcloud storage rm gs://${SAX_DATA_STORAGE_BUCKET} --recursive --continue-on-error