Efectuați transformări în loturi cu Amazon SageMaker Jumpstart Text2Text Generation modele de limbaj mari | Amazon Web Services

Efectuați transformări în loturi cu Amazon SageMaker Jumpstart Text2Text Generation modele de limbaj mari | Amazon Web Services

Astăzi suntem încântați să anunțăm că acum puteți efectua transformări în lot cu Amazon SageMaker JumpStart modele de limbaj mari (LLM) pentru Text2Text Generation. Transformările în lot sunt utile în situațiile în care răspunsurile nu trebuie să fie în timp real și, prin urmare, puteți face inferențe în lot pentru seturi de date mari în vrac. Pentru transformarea lotului, se rulează o lucrare batch care preia intrarea lotului ca set de date și model pre-antrenat și emite predicții pentru fiecare punct de date din setul de date. Transformarea batch este rentabilă, deoarece spre deosebire de punctele finale găzduite în timp real care au hardware persistent, clusterele de transformare batch sunt dărâmate când lucrarea este finalizată și, prin urmare, hardware-ul este utilizat numai pe durata jobului batch.

În unele cazuri de utilizare, solicitările de inferență în timp real pot fi grupate în loturi mici pentru procesarea în lot pentru a crea răspunsuri în timp real sau aproape în timp real. De exemplu, dacă trebuie să procesați un flux continuu de date cu latență scăzută și debit mare, invocarea unui punct final în timp real pentru fiecare cerere separat ar necesita mai multe resurse și poate dura mai mult pentru a procesa toate cererile, deoarece procesarea se face în serie. . O abordare mai bună ar fi să grupați unele dintre solicitări și să apelați punctul final în timp real în modul de inferență în lot, care vă procesează cererile într-o singură trecere înainte a modelului și returnează răspunsul în bloc pentru cerere în timp real sau aproape în timp real. . Latența răspunsului va depinde de câte solicitări grupați și de dimensiunea memoriei instanței, prin urmare puteți ajusta dimensiunea lotului în funcție de cerințele dvs. de afaceri pentru latență și debit. Noi numim asta inferență în lot în timp real deoarece combină conceptul de loturi oferind totuși răspunsuri în timp real. Cu inferența în lot în timp real, puteți obține un echilibru între latența scăzută și debitul ridicat, permițându-vă să procesați volume mari de date în timp util și eficient.

Transformarea batch Jumpstart pentru modelele Text2Text Generation vă permite să treceți hiperparametrii lotului prin variabile de mediu care măresc și mai mult debitul și minimizează latența.

JumpStart oferă modele open-source pregătite pentru o gamă largă de tipuri de probleme, pentru a vă ajuta să începeți cu învățarea automată (ML). Puteți antrena și ajusta progresiv aceste modele înainte de implementare. JumpStart oferă, de asemenea, șabloane de soluții care configurează infrastructura pentru cazuri de utilizare obișnuite și exemple de notebook-uri executabile pentru ML cu Amazon SageMaker. Puteți accesa modelele pre-instruite, șabloanele de soluții și exemplele prin pagina de destinație JumpStart din Amazon SageMaker Studio. De asemenea, puteți accesa modelele JumpStart folosind SDK-ul SageMaker Python.

În această postare, demonstrăm cum să folosiți echipamentele pre-instruite de ultimă generație text2text Modele FLAN T5 de la Hugging Face pentru transformarea lotului și deducerea loturilor în timp real.

Prezentare generală a soluțiilor

Notebook-ul care arată transformarea în lot a modelelor Text2Text FLAN T5 pre-antrenate de la Fata îmbrățișată disponibile în cele ce urmează GitHub depozit. Acest notebook folosește date de la Hugging Face cnn_dailymail set de date pentru o sarcină de rezumare a textului folosind SDK-ul SageMaker.

Următorii sunt pașii cheie pentru implementarea transformării lotului și a inferenței loturilor în timp real:

  1. Configurați cerințele preliminare.
  2. Selectați un model pre-antrenat.
  3. Preluați artefacte pentru model.
  4. Specificați hiperparametrii jobului de transformare în loturi.
  5. Pregătiți datele pentru transformarea lotului.
  6. Rulați sarcina de transformare în lot.
  7. Evaluați rezumatul folosind a ROȘU (Recall-Oriented Understudy for Gisting Evaluation) scor.
  8. Efectuați inferențe pe lot în timp real.

Configurați cerințele preliminare

Înainte de a rula notebook-ul, trebuie să parcurgeți câțiva pași inițiali de configurare. Să setăm rolul de execuție SageMaker, astfel încât să aibă permisiuni să ruleze servicii AWS în numele tău:

sagemaker_session = Session()
aws_role = sagemaker_session.get_caller_identity_arn()
aws_region = boto3.Session().region_name
sess = sagemaker.Session()

Selectați un model pre-antrenat

Folosim modelul huggingface-text2text-flan-t5-large ca model implicit. Opțional, puteți prelua lista de modele Text2Text disponibile pe JumpStart și puteți alege modelul preferat. Această metodă oferă o modalitate simplă de a selecta diferite ID-uri de model folosind același notebook. În scopuri demonstrative, folosim modelul huggingface-text2text-flan-t5-large:

model_id, model_version, = ( "huggingface-text2text-flan-t5-large", "*",
)

Preluați artefacte pentru model

Cu SageMaker, putem efectua inferențe pe modelul pre-antrenat, chiar și fără a-l ajusta mai întâi pe un nou set de date. Începem prin a prelua deploy_image_uri, deploy_source_uri, și model_uri pentru modelul pre-antrenat:

inference_instance_type = "ml.p3.2xlarge" # Retrieve the inference docker container uri. This is the base HuggingFace container image for the default model above.
deploy_image_uri = image_uris.retrieve(
region=None,
framework=None, # automatically inferred from model_id
image_scope="inference",
model_id=model_id,
model_version=model_version,
instance_type=inference_instance_type,
) # Retrieve the model uri.
model_uri = model_uris.retrieve(
model_id=model_id, model_version=model_version, model_scope="inference"
) #Create the SageMaker model instance
model = Model(
image_uri=deploy_image_uri,
model_data=model_uri,
role=aws_role,
predictor_cls=Predictor)

Specificați hiperparametrii jobului de transformare în loturi

Puteți trece orice subset de hiperparametri ca variabile de mediu la jobul de transformare în lot. De asemenea, puteți trece acești hiperparametri într-o sarcină utilă JSON. Cu toate acestea, dacă setați variabile de mediu pentru hiperparametri, așa cum arată codul următor, atunci hiperparametrii avansați din exemplele individuale din sarcina utilă a liniilor JSON nu vor fi utilizați. Dacă doriți să utilizați hiperparametrii din sarcina utilă, poate doriți să setați hyper_params_dict parametrul ca nul în schimb.

#Specify the Batch Job Hyper Params Here, If you want to treate each example hyperparameters different please pass hyper_params_dict as None
hyper_params = {"batch_size":4, "max_length":50, "top_k": 50, "top_p": 0.95, "do_sample": True}
hyper_params_dict = {"HYPER_PARAMS":str(hyper_params)}

Pregătiți datele pentru transformarea lotului

Acum suntem gata să încărcăm cnn_dailymail set de date de la Hugging Face:

cnn_test = load_dataset('cnn_dailymail','3.0.0',split='test')

Trecem peste fiecare intrare de date și creăm datele de intrare în formatul necesar. Creăm un articles.jsonl fișier ca fișier de date de testare care conține articole care trebuie rezumate ca sarcină utilă de intrare. Pe măsură ce creăm acest fișier, anexăm promptul "Briefly summarize this text:" la fiecare rând de intrare de test. Dacă doriți să aveți hiperparametri diferiți pentru fiecare intrare de test, puteți adăuga acești hiperparametri ca parte a creării setului de date.

Noi creăm highlights.jsonl ca fișierul adevărului de bază care conține elementele evidențiate ale fiecărui articol stocat în fișierul de testare articles.jsonl. Stocăm ambele fișiere de testare într-un Serviciul Amazon de stocare simplă (Amazon S3) găleată. Vezi următorul cod:

#You can specify a prompt here
prompt = "Briefly summarize this text: "
#Provide the test data and the ground truth file name
test_data_file_name = "articles.jsonl"
test_reference_file_name = 'highlights.jsonl' test_articles = []
test_highlights =[] # We will go over each data entry and create the data in the input required format as described above
for id, test_entry in enumerate(cnn_test): article = test_entry['article'] highlights = test_entry['highlights'] # Create a payload like this if you want to have different hyperparameters for each test input # payload = {"id": id,"text_inputs": f"{prompt}{article}", "max_length": 100, "temperature": 0.95} # Note that if you specify hyperparameter for each payload individually, you may want to ensure that hyper_params_dict is set to None instead payload = {"id": id,"text_inputs": f"{prompt}{article}"} test_articles.append(payload) test_highlights.append({"id":id, "highlights": highlights}) with open(test_data_file_name, "w") as outfile: for entry in test_articles: outfile.write("%sn" % json.dumps(entry)) with open(test_reference_file_name, "w") as outfile: for entry in test_highlights: outfile.write("%sn" % json.dumps(entry)) # Uploading the data s3 = boto3.client("s3")
s3.upload_file(test_data_file_name, output_bucket, os.path.join(output_prefix + "/batch_input/articles.jsonl"))

Rulați sarcina de transformare în lot

Când începeți o lucrare de transformare în lot, SageMaker lansează resursele de calcul necesare pentru a procesa datele, inclusiv instanțele CPU sau GPU, în funcție de tipul de instanță selectat. În timpul procesului de transformare în loturi, SageMaker asigură și gestionează automat resursele de calcul necesare procesării datelor, inclusiv instanțe, stocare și resurse de rețea. Când sarcina de transformare în lot este finalizată, resursele de calcul sunt curățate automat de SageMaker. Aceasta înseamnă că instanțele și stocarea utilizate în timpul lucrării sunt oprite și eliminate, eliberând resurse și minimizând costurile. Vezi următorul cod:

# Creating the Batch transformer object
batch_transformer = model.transformer( instance_count=1, instance_type=inference_instance_type, output_path=s3_output_data_path, assemble_with="Line", accept="text/csv", max_payload=1, env = hyper_params_dict
) # Making the predications on the input data
batch_transformer.transform(s3_input_data_path, content_type="application/jsonlines", split_type="Line") batch_transformer.wait()

Următorul este un exemplu de înregistrare din articles.jsonl fisierul de testare. Rețineți că înregistrarea din acest fișier are un ID care se potrivește cu predict.jsonl înregistrări de fișiere care arată o înregistrare rezumată ca rezultat din modelul Hugging Face Text2Text. În mod similar, fișierul de adevăr de la sol are, de asemenea, un ID care se potrivește pentru înregistrarea de date. ID-ul de potrivire în fișierul de testare, fișierul de adevăr de teren și fișierul de ieșire permite conectarea înregistrărilor de intrare cu înregistrările de ieșire pentru o interpretare ușoară a rezultatelor.

Următorul este exemplul de înregistrare de intrare furnizată pentru rezumat:

{"id": 0, "text_inputs": "Briefly summarize this text: (CNN)The Palestinian Authority officially became the 123rd member of the International Criminal Court on Wednesday, a step that gives the court jurisdiction over alleged crimes in Palestinian territories. The formal accession was marked with a ceremony at The Hague, in the Netherlands, where the court is based. The Palestinians signed the ICC's founding Rome Statute in January, when they also accepted its jurisdiction over alleged crimes committed "in the occupied Palestinian territory, including East Jerusalem, since June 13, 2014." Later that month, the ICC opened a preliminary examination into the situation in Palestinian territories, paving the way for possible war crimes investigations against Israelis. As members of the court, Palestinians may be subject to counter-charges as well. Israel and the United States, neither of which is an ICC member, opposed the Palestinians' efforts to join the body. But Palestinian Foreign Minister Riad al-Malki, speaking at Wednesday's ceremony, said it was a move toward greater justice. "As Palestine formally becomes a State Party to the Rome Statute today, the world is also a step closer to ending a long era of impunity and injustice," he said, according to an ICC news release. "Indeed, today brings us closer to our shared goals of justice and peace." Judge Kuniko Ozaki, a vice president of the ICC, said acceding to the treaty was just the first step for the Palestinians. "As the Rome Statute today enters into force for the State of Palestine, Palestine acquires all the rights as well as responsibilities that come with being a State Party to the Statute. These are substantive commitments, which cannot be taken lightly," she said. Rights group Human Rights Watch welcomed the development. "Governments seeking to penalize Palestine for joining the ICC should immediately end their pressure, and countries that support universal acceptance of the court's treaty should speak out to welcome its membership," said Balkees Jarrah, international justice counsel for the group. "What's objectionable is the attempts to undermine international justice, not Palestine's decision to join a treaty to which over 100 countries around the world are members." In January, when the preliminary ICC examination was opened, Israeli Prime Minister Benjamin Netanyahu described it as an outrage, saying the court was overstepping its boundaries. The United States also said it "strongly" disagreed with the court's decision. "As we have said repeatedly, we do not believe that Palestine is a state and therefore we do not believe that it is eligible to join the ICC," the State Department said in a statement. It urged the warring sides to resolve their differences through direct negotiations. "We will continue to oppose actions against Israel at the ICC as counterproductive to the cause of peace," it said. But the ICC begs to differ with the definition of a state for its purposes and refers to the territories as "Palestine." While a preliminary examination is not a formal investigation, it allows the court to review evidence and determine whether to investigate suspects on both sides. Prosecutor Fatou Bensouda said her office would "conduct its analysis in full independence and impartiality." The war between Israel and Hamas militants in Gaza last summer left more than 2,000 people dead. The inquiry will include alleged war crimes committed since June. The International Criminal Court was set up in 2002 to prosecute genocide, crimes against humanity and war crimes. CNN's Vasco Cotovio, Kareem Khadder and Faith Karimi contributed to this report."}

Următorul este rezultatul estimat cu rezumat:

{'id': 0, 'generated_texts': ['The Palestinian Authority officially became a member of the International Criminal Court on Wednesday, a step that gives the court jurisdiction over alleged crimes in Palestinian territories.']}

Următoarea este rezumarea adevărului de bază în scopul evaluării modelului:

{"id": 0, "highlights": "Membership gives the ICC jurisdiction over alleged crimes committed in Palestinian territories since last June .nIsrael and the United States opposed the move, which could open the door to war crimes investigations against Israelis ."}

În continuare, folosim adevărul de bază și rezultatele prezise pentru evaluarea modelului.

Evaluați modelul folosind un scor ROUGE¶

ROȘU, sau Recall-Oriented Understudy pentru Gisting Evaluation, este un set de metrici și un pachet software utilizat pentru evaluarea rezumatului automat și a traducerii automate în procesarea limbajului natural. Valorile compară un rezumat sau o traducere produsă automat cu un rezumat sau traducere de referință (produs de oameni) sau cu un set de referințe.

În codul următor, combinăm rezumatele anticipate și cele originale, unindu-le pe cheia comună id și folosește asta pentru a calcula scorul ROUGE:

# Downloading the predictions
s3.download_file(
output_bucket, output_prefix + "/batch_output/" + "articles.jsonl.out", "predict.jsonl"
) with open('predict.jsonl', 'r') as json_file:
json_list = list(json_file) # Creating the prediction list for the dataframe
predict_dict_list = []
for predict in json_list:
if len(predict) > 1:
predict_dict = ast.literal_eval(predict)
predict_dict_req = {"id": predict_dict["id"], "prediction": predict_dict["generated_texts"][0]}
predict_dict_list.append(predict_dict_req) # Creating the predictions dataframe
predict_df = pd.DataFrame(predict_dict_list) test_highlights_df = pd.DataFrame(test_highlights) # Combining the predict dataframe with the original summarization on id to compute the rouge score
df_merge = test_highlights_df.merge(predict_df, on="id", how="left") rouge = evaluate.load('rouge')
results = rouge.compute(predictions=list(df_merge["prediction"]),references=list(df_merge["highlights"]))
print(results)
{'rouge1': 0.32749078992945646, 'rouge2': 0.126038645005132, 'rougeL': 0.22764277967933363, 'rougeLsum': 0.28162915746368966}

Efectuați inferențe pe lot în timp real

În continuare, vă arătăm cum să rulați inferențe în lot în timp real pe punctul final, furnizând intrările sub formă de listă. Folosim același ID de model și set de date ca mai devreme, cu excepția faptului că luăm câteva înregistrări din setul de date de testare și le folosim pentru a invoca un punct final în timp real.

Următorul cod arată cum să creați și să implementați un punct final în timp real pentru inferență în loturi în timp real:

from sagemaker.utils import name_from_base
endpoint_name = name_from_base(f"jumpstart-example-{model_id}")
# deploy the Model. Note that we need to pass Predictor class when we deploy model through Model class,
# for being able to run inference through the sagemaker API.
model_predictor = model.deploy( initial_instance_count=1, instance_type=inference_instance_type, predictor_cls=Predictor, endpoint_name=endpoint_name
)

În continuare, ne pregătim sarcina utilă de intrare. Pentru aceasta, folosim datele pe care le-am pregătit mai devreme și extragem primele 10 intrări de test și anexăm intrările de text cu hiperparametrii pe care vrem să-i folosim. Oferim această sarcină utilă în timp real invoke_endpoint. Sarcina de răspuns este apoi returnată ca o listă de răspunsuri. Vezi următorul cod:

#Provide all the text inputs to the model as a list
text_inputs = [entry["text_inputs"] for entry in test_articles[0:10]] # The information about the different Parameters is provided above
payload = { "text_inputs": text_inputs, "max_length": 50, "num_return_sequences": 1, "top_k": 50, "top_p": 0.95, "do_sample": True, "batch_size": 4
} def query_endpoint_with_json_payload(encoded_json, endpoint_name):
client = boto3.client("runtime.sagemaker")
response = client.invoke_endpoint(
EndpointName=endpoint_name, ContentType="application/json", Body=encoded_json
)
return response query_response = query_endpoint_with_json_payload(
json.dumps(payload).encode("utf-8"), endpoint_name=endpoint_name
) def parse_response_multiple_texts(query_response):
model_predictions = json.loads(query_response["Body"].read())
return model_predictions generated_text_list = parse_response_multiple_texts(query_response)
print(*generated_text_list, sep='n')

A curăța

După ce ați testat punctul final, asigurați-vă că ștergeți punctul final de inferență SageMaker și ștergeți modelul pentru a evita costurile.

Concluzie

În acest caiet, am efectuat o transformare în lot pentru a prezenta modelul Hugging Face Text2Text Generator pentru sarcini de rezumat. Transformarea lotului este avantajoasă în obținerea de inferențe din seturi mari de date fără a necesita un punct final persistent. Am legat înregistrările de intrare cu inferențe pentru a ajuta la interpretarea rezultatelor. Am folosit scorul ROUGE pentru a compara rezumarea datelor de test cu rezumatul generat de model.

În plus, am demonstrat inferența pe lot în timp real, în care puteți trimite un lot mic de date la un punct final în timp real pentru a obține un echilibru între latență și debit pentru scenarii precum fluxul de date de intrare. Inferența pe lot în timp real ajută la creșterea debitului pentru solicitările în timp real.

Încercați astăzi transformarea lotului cu modelele Text2Text Generation în SageMaker și transmiteți-ne feedback-ul dvs.!


Despre autori

Perform batch transforms with Amazon SageMaker Jumpstart Text2Text Generation large language models | Amazon Web Services PlatoBlockchain Data Intelligence. Vertical Search. Ai.Hemant Singh este un inginer de învățare automată cu experiență în algoritmii încorporați Amazon SageMaker JumpStart și Amazon SageMaker. Și-a obținut masterul de la Institutul Courant de Științe Matematice și B.Tech de la IIT Delhi. El are experiență în lucrul la o gamă variată de probleme de învățare automată în domeniul procesării limbajului natural, al vederii computerizate și al analizei seriilor temporale.

Perform batch transforms with Amazon SageMaker Jumpstart Text2Text Generation large language models | Amazon Web Services PlatoBlockchain Data Intelligence. Vertical Search. Ai.Rachna Chadha este arhitect principal de soluții AI/ML în conturi strategice la AWS. Rachna este o optimistă care crede că utilizarea etică și responsabilă a inteligenței artificiale poate îmbunătăți societatea în viitor și poate aduce prosperitate economică și socială. În timpul liber, Rachnei îi place să petreacă timpul cu familia ei, să facă drumeții și să asculte muzică.

Perform batch transforms with Amazon SageMaker Jumpstart Text2Text Generation large language models | Amazon Web Services PlatoBlockchain Data Intelligence. Vertical Search. Ai.Dr. Ashish Khetan este un om de știință senior aplicat cu algoritmi încorporați Amazon SageMaker și ajută la dezvoltarea algoritmilor de învățare automată. Și-a luat doctoratul la Universitatea din Illinois Urbana-Champaign. Este un cercetător activ în învățarea automată și inferența statistică și a publicat multe lucrări în conferințele NeurIPS, ICML, ICLR, JMLR, ACL și EMNLP.

Timestamp-ul:

Mai mult de la Învățare automată AWS