Utför batchtransformationer med Amazon SageMaker Jumpstart Text2Text Generation stora språkmodeller | Amazon webbtjänster

Utför batchtransformationer med Amazon SageMaker Jumpstart Text2Text Generation stora språkmodeller | Amazon webbtjänster

Idag är vi glada att kunna meddela att du nu kan utföra batchtransformationer med Amazon SageMaker JumpStart stora språkmodeller (LLM) för Text2Text Generation. Batchtransformationer är användbara i situationer där svaren inte behöver vara i realtid och därför kan du göra slutsatser i batch för stora datamängder i bulk. För batchtransformering körs ett batchjobb som tar batchinmatning som en datamängd och en förtränad modell, och matar ut förutsägelser för varje datapunkt i datamängden. Batchtransform är kostnadseffektiv eftersom till skillnad från realtidsvärdade slutpunkter som har beständig hårdvara, rivs batchtransformkluster ner när jobbet är klart och därför används hårdvaran bara under batchjobbets varaktighet.

I vissa fall kan slutledningsförfrågningar i realtid grupperas i små partier för batchbearbetning för att skapa svar i realtid eller nästan i realtid. Om du till exempel behöver bearbeta en kontinuerlig ström av data med låg latens och hög genomströmning, skulle anropa en realtidsslutpunkt för varje begäran separat kräva mer resurser och kan ta längre tid att bearbeta alla förfrågningar eftersom behandlingen sker i serie . Ett bättre tillvägagångssätt skulle vara att gruppera några av förfrågningarna och anropa realtidsslutpunkten i batch-inferensläge, som behandlar dina förfrågningar i ett framåtpass av modellen och returnerar bulksvaret för begäran i realtid eller nästan realtid . Svarets latens beror på hur många förfrågningar du grupperar och instansminnesstorleken, därför kan du justera batchstorleken enligt dina affärskrav för latens och genomströmning. Vi kallar detta batch slutledning i realtid eftersom det kombinerar konceptet med batchning samtidigt som det ger svar i realtid. Med batch-inferens i realtid kan du uppnå en balans mellan låg latens och hög genomströmning, vilket gör att du kan bearbeta stora datamängder på ett snabbt och effektivt sätt.

Jumpstart batch-transformation för Text2Text Generation-modeller låter dig skicka batchhyperparametrarna genom miljövariabler som ytterligare ökar genomströmningen och minimerar latensen.

JumpStart tillhandahåller förtränade modeller med öppen källkod för ett brett utbud av problemtyper för att hjälpa dig komma igång med maskininlärning (ML). Du kan stegvis träna och ställa in dessa modeller före driftsättning. JumpStart tillhandahåller också lösningsmallar som ställer in infrastruktur för vanliga användningsfall och körbara exempel anteckningsböcker för ML med Amazon SageMaker. Du kan komma åt de förutbildade modellerna, lösningsmallarna och exemplen via JumpStart-målsidan i Amazon SageMaker Studio. Du kan också komma åt JumpStart-modeller med SageMaker Python SDK.

I det här inlägget visar vi hur man använder den senaste förutbildade text2text FLAN T5-modeller från Hugging Face för batchtransformering och batchslutledning i realtid.

Lösningsöversikt

Anteckningsboken som visar batchtransformation av förtränade Text2Text FLAN T5-modeller från Kramande ansikte finns i följande GitHub repository. Den här anteckningsboken använder data från Hugging Face cnn_daymail datauppsättning för en textsammanfattningsuppgift med SageMaker SDK.

Följande är nyckelstegen för att implementera batchtransformering och batchinferens i realtid:

  1. Ställ in förutsättningar.
  2. Välj en förutbildad modell.
  3. Hämta artefakter för modellen.
  4. Ange hyperparametrar för batchtransformeringsjobb.
  5. Förbered data för batchtransformeringen.
  6. Kör batchtransformeringsjobbet.
  7. Utvärdera sammanfattningen med hjälp av a RÖD (Recall-Oriented Understudy for Gisting Evaluation) poäng.
  8. Utför batch slutledning i realtid.

Ställ in förutsättningar

Innan du kör notebook-datorn måste du slutföra några inledande installationssteg. Låt oss ställa in SageMaker-exekveringsrollen så att den har behörighet att köra AWS-tjänster för din räkning:

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

Välj en förutbildad modell

Vi använder huggingface-text2text-flan-t5-large-modellen som standardmodell. Alternativt kan du hämta listan över tillgängliga Text2Text-modeller på JumpStart och välja din föredragna modell. Denna metod ger ett enkelt sätt att välja olika modell-ID:n med samma anteckningsbok. I demonstrationssyfte använder vi modellen huggingface-text2text-flan-t5-large:

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

Hämta artefakter för modellen

Med SageMaker kan vi göra slutledningar på den förtränade modellen, även utan att finjustera den först på en ny datamängd. Vi börjar med att hämta deploy_image_uri, deploy_source_urioch model_uri för den förtränade modellen:

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)

Ange hyperparametrar för batchtransformeringsjobb

Du kan skicka vilken delmängd som helst av hyperparametrar som miljövariabler till batchtransformeringsjobbet. Du kan också skicka dessa hyperparametrar i en JSON-nyttolast. Men om du ställer in miljövariabler för hyperparametrar som följande kod visar, kommer de avancerade hyperparametrarna från de individuella exemplen i JSON-radernas nyttolast inte att användas. Om du vill använda hyperparametrar från nyttolasten, kanske du vill ställa in hyper_params_dict parameter som null istället.

#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)}

Förbered data för batchtransformering

Nu är vi redo att ladda cnn_daymail dataset från Hugging Face:

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

Vi går igenom varje datainmatning och skapar indata i önskat format. Vi skapar en articles.jsonl fil som en testdatafil som innehåller artiklar som behöver sammanfattas som indatanyttolast. När vi skapar den här filen lägger vi till prompten "Briefly summarize this text:" till varje testingångsrad. Om du vill ha olika hyperparametrar för varje testingång kan du lägga till dessa hyperparametrar som en del av att skapa datamängden.

Vi skapar highlights.jsonl som grundsannningsfilen som innehåller höjdpunkter för varje artikel som lagras i testfilen articles.jsonl. Vi lagrar båda testfilerna i en Amazon enkel lagringstjänst (Amazon S3) hink. Se följande kod:

#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"))

Kör batchtransformeringsjobbet

När du startar ett batchtransformeringsjobb, startar SageMaker de nödvändiga beräkningsresurserna för att bearbeta data, inklusive CPU- eller GPU-instanser beroende på den valda instanstypen. Under batchtransformeringsjobbet tillhandahåller och hanterar SageMaker automatiskt de beräkningsresurser som krävs för att bearbeta data, inklusive instanser, lagrings- och nätverksresurser. När batchtransformeringsjobbet är klart rensas beräkningsresurserna automatiskt upp av SageMaker. Detta innebär att instanserna och lagringen som används under jobbet stoppas och tas bort, vilket frigör resurser och minimerar kostnaderna. Se följande kod:

# 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()

Följande är ett exempel på rekord från articles.jsonl testfil. Observera att posten i den här filen har ett ID som matchar predict.jsonl filposter som visar en sammanfattad post som utdata från Hugging Face Text2Text-modellen. På samma sätt har ground truth-filen också ett matchande ID för dataposten. Det matchande ID:t över testfilen, marksanningsfilen och utdatafilen gör det möjligt att länka indataposter med utdataposter för enkel tolkning av resultaten.

Följande är exempel på indataposten som tillhandahålls för sammanfattning:

{"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."}

Följande är den förutspådda produktionen med sammanfattning:

{'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.']}

Följande är grundsanningens sammanfattning för modellutvärderingsändamål:

{"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 ."}

Därefter använder vi grundsanningen och förutspådda utdata för modellutvärdering.

Utvärdera modellen med ett ROUGE-poäng¶

RÖD, eller Recall-Oriented Understudy for Gisting Evaluation, är en uppsättning mätvärden och ett mjukvarupaket som används för att utvärdera automatisk sammanfattning och maskinöversättning i naturlig språkbehandling. Mätvärdena jämför en automatiskt producerad sammanfattning eller översättning mot en referens (människproducerad) sammanfattning eller översättning eller en uppsättning referenser.

I följande kod kombinerar vi de förutsagda och ursprungliga sammanfattningarna genom att sammanfoga dem på den gemensamma nyckeln id och använd detta för att beräkna ROUGE-poängen:

# 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}

Utför batch slutledning i realtid

Därefter visar vi dig hur du kör batch-inferens i realtid på slutpunkten genom att tillhandahålla ingångarna som en lista. Vi använder samma modell-ID och datauppsättning som tidigare, förutom att vi tar några få poster från testdatauppsättningen och använder dem för att anropa en slutpunkt i realtid.

Följande kod visar hur man skapar och distribuerar en realtidsslutpunkt för batch-slutledning i realtid:

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
)

Därefter förbereder vi vår indatanyttolast. För detta använder vi data som vi förberett tidigare och extraherar de första 10 testingångarna och lägger till textinmatningarna med hyperparametrar som vi vill använda. Vi tillhandahåller denna nyttolast i realtid invoke_endpoint. Svarsnyttolasten returneras sedan som en lista med svar. Se följande kod:

#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')

Städa upp

Efter att du har testat slutpunkten, se till att du tar bort SageMaker slutpunkten och tar bort modellen för att undvika avgifter.

Slutsats

I den här anteckningsboken utförde vi en batchtransformering för att visa upp Hugging Face Text2Text Generator-modellen för sammanfattningsuppgifter. Batchtransform är fördelaktigt för att erhålla slutsatser från stora datamängder utan att kräva en beständig slutpunkt. Vi kopplade indataposter med slutsatser för att underlätta resultattolkningen. Vi använde ROUGE-poängen för att jämföra testdatasammanfattningen med den modellgenererade sammanfattningen.

Dessutom demonstrerade vi batch-inferens i realtid, där du kan skicka en liten batch data till en realtidsslutpunkt för att uppnå en balans mellan latens och genomströmning för scenarier som strömmande indata. Batch-inferens i realtid hjälper till att öka genomströmningen för realtidsförfrågningar.

Prova batchtransformeringen med Text2Text Generation-modeller i SageMaker idag och låt oss veta din feedback!


Om författarna

Utför batchtransformationer med Amazon SageMaker Jumpstart Text2Text Generation stora språkmodeller | Amazon Web Services PlatoBlockchain Data Intelligence. Vertikal sökning. Ai.Hemant Singh är en maskininlärningsingenjör med erfarenhet av Amazon SageMaker JumpStart och Amazon SageMaker inbyggda algoritmer. Han tog sina masters från Courant Institute of Mathematical Sciences och B.Tech från IIT Delhi. Han har erfarenhet av att arbeta med en mängd olika maskininlärningsproblem inom området naturlig språkbehandling, datorseende och tidsserieanalys.

Utför batchtransformationer med Amazon SageMaker Jumpstart Text2Text Generation stora språkmodeller | Amazon Web Services PlatoBlockchain Data Intelligence. Vertikal sökning. Ai.Rachna Chadha är en Principal Solutions Architect AI/ML i Strategic Accounts på AWS. Rachna är en optimist som tror att den etiska och ansvarsfulla användningen av AI kan förbättra samhället i framtiden och ge ekonomiskt och socialt välstånd. På fritiden gillar Rachna att umgås med sin familj, vandra och lyssna på musik.

Utför batchtransformationer med Amazon SageMaker Jumpstart Text2Text Generation stora språkmodeller | Amazon Web Services PlatoBlockchain Data Intelligence. Vertikal sökning. Ai.Dr Ashish Khetan är en Senior Applied Scientist med Amazon SageMaker inbyggda algoritmer och hjälper till att utveckla maskininlärningsalgoritmer. Han tog sin doktorsexamen från University of Illinois Urbana-Champaign. Han är en aktiv forskare inom maskininlärning och statistisk slutledning och har publicerat många artiklar i NeurIPS, ICML, ICLR, JMLR, ACL och EMNLP-konferenser.

Tidsstämpel:

Mer från AWS maskininlärning