Ejemplos de código para la personalización de modelos - Amazon Bedrock

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Ejemplos de código para la personalización de modelos

Los siguientes ejemplos de código muestran cómo preparar un conjunto de datos básico, configurar los permisos, crear un modelo personalizado, ver los archivos de salida, adquirir el rendimiento del modelo y realizar inferencias en el modelo. Puede modificar estos fragmentos de código según su caso de uso específico.

  1. Prepara el conjunto de datos de entrenamiento.

    1. Cree un archivo de conjunto de datos de entrenamiento que contenga la siguiente línea y asígnele un nombre train.jsonl.

      {"prompt": "what is AWS", "completion": "it's Amazon Web Services"}
    2. Crea un bucket de S3 para los datos de entrenamiento y otro para los datos de salida (los nombres deben ser únicos).

    3. Cargar train.jsonl en el depósito de datos de entrenamiento.

  2. Crea una política para acceder a tu formación y asójala a un IAM puesto con una relación de confianza en Amazon Bedrock. Selecciona la pestaña correspondiente al método que prefieras y sigue los pasos:

    Console
    1. Cree la política de S3.

      1. Navegue hasta la IAM consola en https://console.aws.amazon.com/iam y elija Políticas en el panel de navegación izquierdo.

      2. Seleccione Crear política y, JSONa continuación, abra el editor de políticas.

      3. Pegue la siguiente política, sustituyéndola ${training-bucket} y ${output-bucket} con los nombres de los buckets y, a continuación, selecciona Siguiente.

        { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::${training-bucket}", "arn:aws:s3:::${training-bucket}/*" ] }, { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:PutObject", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::${output-bucket}", "arn:aws:s3:::${output-bucket}/*" ] } ] }
      4. Asigne un nombre a la política MyFineTuningDataAccess y selecciona Crear política.

    2. Cree un IAM rol y adjunte la política.

      1. En el panel de navegación izquierdo, selecciona Roles y, a continuación, selecciona Crear rol.

      2. Selecciona Política de confianza personalizada, pega la siguiente política y selecciona Siguiente.

        { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "bedrock.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
      3. Busca la MyFineTuningDataAccess la política que creó, seleccione la casilla de verificación y elija Siguiente.

      4. Asigne un nombre al rol MyCustomizationRole y selecciona Create role.

    CLI
    1. Cree un archivo llamado BedrockTrust.json y pegue la siguiente política en él.

      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "bedrock.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
    2. Cree otro archivo llamado MyFineTuningDataAccess.json y pegue la siguiente política en él, sustituyendo ${training-bucket} y ${output-bucket} con los nombres de sus cubos.

      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::${training-bucket}", "arn:aws:s3:::${training-bucket}/*" ] }, { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:PutObject", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::${output-bucket}", "arn:aws:s3:::${output-bucket}/*" ] } ] }
    3. En una terminal, navegue hasta la carpeta que contiene las políticas que creó.

    4. Realice una CreateRolesolicitud para crear un IAM rol llamado MyCustomizationRole y adjunte el BedrockTrust.json política de confianza que ha creado.

      aws iam create-role \ --role-name MyCustomizationRole \ --assume-role-policy-document file://BedrockTrust.json
    5. Realice una CreatePolicysolicitud para crear la política de acceso a los datos de S3 con MyFineTuningDataAccess.json archivo que ha creado. La respuesta devuelve una Arn para la política.

      aws iam create-policy \ --policy-name MyFineTuningDataAccess \ --policy-document file://myFineTuningDataAccess.json
    6. AttachRolePolicySolicita adjuntar la política de acceso a datos de S3 a tu función y policy-arn sustitúyala por la que aparece ARN en la respuesta del paso anterior:

      aws iam attach-role-policy \ --role-name MyCustomizationRole \ --policy-arn ${policy-arn}
    Python
    1. Ejecute el siguiente código para CreateRolesolicitar la creación de un IAM rol llamado MyCustomizationRole y para realizar una CreatePolicysolicitud para crear una política de acceso a datos de S3 llamada MyFineTuningDataAccess. Para la política de acceso a datos de S3, sustituya ${training-bucket} y ${output-bucket} con los nombres de sus buckets de S3.

      import boto3 import json iam = boto3.client("iam") iam.create_role( RoleName="MyCustomizationRole", AssumeRolePolicyDocument=json.dumps({ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "bedrock.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }) ) iam.create_policy( PolicyName="MyFineTuningDataAccess", PolicyDocument=json.dumps({ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::${training-bucket}", "arn:aws:s3:::${training-bucket}/*" ] }, { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:PutObject", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::${output-bucket}", "arn:aws:s3:::${output-bucket}/*" ] } ] }) )
    2. ArnSe devuelve un N en la respuesta. Ejecute el siguiente fragmento de código para realizar una AttachRolePolicysolicitud, sustituyendo ${policy-arn} con el devuelto. Arn

      iam.attach_role_policy( RoleName="MyCustomizationRole", PolicyArn="${policy-arn}" )
  3. Seleccione un idioma para ver los ejemplos de código con los que ejecutar las API operaciones de personalización del modelo.

CLI

En primer lugar, cree un archivo de texto llamado FineTuningData.json. Copie el JSON código de abajo en el archivo de texto, sustituyendo ${training-bucket} y ${output-bucket} con los nombres de sus buckets de S3.

{ "trainingDataConfig": { "s3Uri": "s3://${training-bucket}/train.jsonl" }, "outputDataConfig": { "s3Uri": "s3://${output-bucket}" } }

Para enviar un trabajo de personalización de modelos, navegue hasta la carpeta que contiene FineTuningData.json en una terminal y ejecute el siguiente comando en la línea de comandos, sustituyendo ${your-customization-role-arn} con la función de personalización de modelos que haya configurado.

aws bedrock create-model-customization-job \ --customization-type FINE_TUNING \ --base-model-identifier arn:aws:bedrock:us-east-1::foundation-model/amazon.titan-text-express-v1 \ --role-arn ${your-customization-role-arn} \ --job-name MyFineTuningJob \ --custom-model-name MyCustomModel \ --hyper-parameters epochCount=1,batchSize=1,learningRate=.0005,learningRateWarmupSteps=0 \ --cli-input-json file://FineTuningData.json

La respuesta devuelve un jobArn. Deje que el trabajo se complete algún tiempo. Puede comprobar su estado con el siguiente comando.

aws bedrock get-model-customization-job \ --job-identifier "jobArn"

Cuando el status esCOMPLETE, puedes verlo trainingMetrics en la respuesta. Puede descargar los artefactos a la carpeta actual ejecutando el siguiente comando, sustituyendo aet.et-bucket con el nombre del depósito de salida y jobId con el ID del trabajo de personalización (la secuencia que sigue a la última barra deljobArn).

aws s3 cp s3://${output-bucket}/model-customization-job-jobId . --recursive

Adquiera un rendimiento aprovisionado sin compromiso para su modelo personalizado con el siguiente comando.

nota

Se le cobrará por hora por esta compra. Usa la consola para ver las estimaciones de precios de las diferentes opciones.

aws bedrock create-provisioned-model-throughput \ --model-id MyCustomModel \ --provisioned-model-name MyProvisionedCustomModel \ --model-units 1

La respuesta devuelve unprovisionedModelArn. Deje que se cree el rendimiento aprovisionado durante algún tiempo. Para comprobar su estado, introduzca el nombre o ARN el modelo aprovisionado tal y como se indica provisioned-model-id en el siguiente comando.

aws bedrock get-provisioned-model-throughput \ --provisioned-model-id ${provisioned-model-arn}

Si status es asíInService, puede ejecutar una inferencia con su modelo personalizado con el siguiente comando. Debe proporcionar el ARN modelo aprovisionado como. model-id El resultado se escribe en un archivo llamado output.txt en la carpeta actual.

aws bedrock-runtime invoke-model \ --model-id ${provisioned-model-arn} \ --body '{"inputText": "What is AWS?", "textGenerationConfig": {"temperature": 0.5}}' \ --cli-binary-format raw-in-base64-out \ output.txt
Python

Ejecute el siguiente fragmento de código para realizar un trabajo de ajuste. Reemplazar ${your-customization-role-arn} con el ARN MyCustomizationRole que tú configuras y sustituyes ${training-bucket} y ${output-bucket} con los nombres de sus buckets de S3.

import boto3 bedrock = boto3.client(service_name='bedrock') # Set parameters customizationType = "FINE_TUNING" baseModelIdentifier = "arn:aws:bedrock:us-east-1::foundation-model/amazon.titan-text-express-v1" roleArn = "${your-customization-role-arn}" jobName = "MyFineTuningJob" customModelName = "MyCustomModel" hyperParameters = { "epochCount": "1", "batchSize": "1", "learningRate": ".0005", "learningRateWarmupSteps": "0" } trainingDataConfig = {"s3Uri": "s3://${training-bucket}/myInputData/train.jsonl"} outputDataConfig = {"s3Uri": "s3://${output-bucket}/myOutputData"} # Create job response_ft = bedrock.create_model_customization_job( jobName=jobName, customModelName=customModelName, roleArn=roleArn, baseModelIdentifier=baseModelIdentifier, hyperParameters=hyperParameters, trainingDataConfig=trainingDataConfig, outputDataConfig=outputDataConfig ) jobArn = response_ft.get('jobArn')

La respuesta devuelve un jobArn. Deje que el trabajo se complete algún tiempo. Puede comprobar su estado con el siguiente comando.

bedrock.get_model_customization_job(jobIdentifier=jobArn).get('status')

Cuando el status esCOMPLETE, puedes verlo trainingMetrics en la GetModelCustomizationJobrespuesta. También puedes seguir los pasos que se indican en Descargar objetos para descargar las métricas.

Adquiera un rendimiento aprovisionado sin compromiso para su modelo personalizado con el siguiente comando.

response_pt = bedrock.create_provisioned_model_throughput( modelId="MyCustomModel", provisionedModelName="MyProvisionedCustomModel", modelUnits="1" ) provisionedModelArn = response_pt.get('provisionedModelArn')

La respuesta devuelve un. provisionedModelArn Deje que se cree el rendimiento aprovisionado durante algún tiempo. Para comprobar su estado, introduzca el nombre o ARN el modelo aprovisionado tal y como se indica provisionedModelId en el siguiente comando.

bedrock.get_provisioned_model_throughput(provisionedModelId=provisionedModelArn)

Si status es asíInService, puede ejecutar una inferencia con su modelo personalizado con el siguiente comando. Debe proporcionar el ARN modelo aprovisionado como. modelId

import json import logging import boto3 from botocore.exceptions import ClientError class ImageError(Exception): "Custom exception for errors returned by the model" def __init__(self, message): self.message = message logger = logging.getLogger(__name__) logging.basicConfig(level=logging.INFO) def generate_text(model_id, body): """ Generate text using your provisioned custom model. Args: model_id (str): The model ID to use. body (str) : The request body to use. Returns: response (json): The response from the model. """ logger.info( "Generating text with your provisioned custom model %s", model_id) brt = boto3.client(service_name='bedrock-runtime') accept = "application/json" content_type = "application/json" response = brt.invoke_model( body=body, modelId=model_id, accept=accept, contentType=content_type ) response_body = json.loads(response.get("body").read()) finish_reason = response_body.get("error") if finish_reason is not None: raise ImageError(f"Text generation error. Error is {finish_reason}") logger.info( "Successfully generated text with provisioned custom model %s", model_id) return response_body def main(): """ Entrypoint for example. """ try: logging.basicConfig(level=logging.INFO, format="%(levelname)s: %(message)s") model_id = provisionedModelArn body = json.dumps({ "inputText": "what is AWS?" }) response_body = generate_text(model_id, body) print(f"Input token count: {response_body['inputTextTokenCount']}") for result in response_body['results']: print(f"Token count: {result['tokenCount']}") print(f"Output text: {result['outputText']}") print(f"Completion reason: {result['completionReason']}") except ClientError as err: message = err.response["Error"]["Message"] logger.error("A client error occurred: %s", message) print("A client error occured: " + format(message)) except ImageError as err: logger.error(err.message) print(err.message) else: print( f"Finished generating text with your provisioned custom model {model_id}.") if __name__ == "__main__": main()