Distribuisci modelli personalizzati e ottimizzati da Amazon S3 e Amazon utilizzando kubectl FSx - Amazon SageMaker AI

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Distribuisci modelli personalizzati e ottimizzati da Amazon S3 e Amazon utilizzando kubectl FSx

I passaggi seguenti mostrano come distribuire modelli archiviati su Amazon S3 o Amazon su un cluster FSx SageMaker HyperPod Amazon utilizzando kubectl.

Le istruzioni seguenti contengono celle di codice e comandi progettati per essere eseguiti in un terminale. Assicurati di aver configurato il tuo ambiente con le AWS credenziali prima di eseguire questi comandi.

Prerequisiti

Prima di iniziare, verifica di aver:

Installazione e configurazione

Sostituisci tutti i valori segnaposto con gli tuoi identificatori delle risorse effettivi.

  1. Seleziona la tua Regione nell’ambiente.

    export REGION=<region>
  2. Inizializza il nome del cluster. Questo identifica il HyperPod cluster in cui verrà distribuito il tuo modello.

    Nota

    Rivolgiti all’amministratore del cluster per assicurarti di ottenere le autorizzazioni per questo ruolo o utente. Puoi eseguire !aws sts get-caller-identity --query "Arn" per verificare quale ruolo o utente stai utilizzando nel terminale.

    # Specify your hyperpod cluster name here HYPERPOD_CLUSTER_NAME="<Hyperpod_cluster_name>" # NOTE: For sample deployment, we use g5.8xlarge for deepseek-r1 1.5b model which has sufficient memory and GPU instance_type="ml.g5.8xlarge"
  3. Inizializza il namespace del cluster. L’amministratore del cluster dovrebbe aver già creato un account di servizio hyperpod-inference nel tuo namespace.

    cluster_namespace="<namespace>"
  4. Crea una CRD utilizzando una delle seguenti opzioni:

    Using Amazon FSx as the model source
    1. Imposta un nome per l' SageMaker endpoint.

      export SAGEMAKER_ENDPOINT_NAME="deepseek15b-fsx"
    2. Configura l'ID del FSx file system Amazon da utilizzare.

      export FSX_FILE_SYSTEM_ID="fs-1234abcd"
    3. Di seguito è riportato un file yaml di esempio per la creazione di un endpoint con Amazon FSx e un modello. DeepSeek

      Nota

      Per i cluster con il partizionamento GPU abilitato, sostituiscilo con il nome della risorsa MIG appropriato, nvidia.com/gpu ad esempio. nvidia.com/mig-1g.10gb Per ulteriori informazioni, consulta Invio di attività con MIG.

      cat <<EOF> deploy_fsx_cluster_inference.yaml
      ---
      apiVersion: inference.sagemaker.aws.amazon.com/v1
      kind: InferenceEndpointConfig
      metadata:
        name: lmcache-test
        namespace: inf-update
      spec:
        modelName: Llama-3.1-8B-Instruct
        instanceType: ml.g5.24xlarge
        invocationEndpoint: v1/chat/completions
        replicas: 2
        modelSourceConfig:
          fsxStorage:
            fileSystemId: $FSX_FILE_SYSTEM_ID
          modelLocation: deepseek-1-5b
          modelSourceType: fsx
        worker:
          environmentVariables:
          - name: HF_MODEL_ID
            value: /opt/ml/model
          - name: SAGEMAKER_PROGRAM
            value: inference.py
          - name: SAGEMAKER_SUBMIT_DIRECTORY
            value: /opt/ml/model/code
          - name: MODEL_CACHE_ROOT
            value: /opt/ml/model
          - name: SAGEMAKER_ENV
            value: '1'
          image: 763104351884.dkr.ecr.us-east-2.amazonaws.com/huggingface-pytorch-tgi-inference:2.4.0-tgi2.3.1-gpu-py311-cu124-ubuntu22.04-v2.0
          modelInvocationPort:
            containerPort: 8080
            name: http
          modelVolumeMount:
            mountPath: /opt/ml/model
            name: model-weights
          resources:
            limits:
              nvidia.com/gpu: 1
              # For MIG-enabled instances, use: nvidia.com/mig-1g.10gb: 1
            requests:
              cpu: 30000m
              memory: 100Gi
              nvidia.com/gpu: 1
              # For MIG-enabled instances, use: nvidia.com/mig-1g.10gb: 1
      EOF
    Using Amazon S3 as the model source
    1. Imposta un nome per l'endpoint. SageMaker

      export SAGEMAKER_ENDPOINT_NAME="deepseek15b-s3"
    2. Configura la posizione del bucket Amazon S3 in cui si trova il modello.

      export S3_MODEL_LOCATION="deepseek-qwen-1-5b"
    3. Di seguito è riportato un file yaml di esempio per la creazione di un endpoint con Amazon S3 e un modello. DeepSeek

      Nota

      Per i cluster con il partizionamento GPU abilitato, sostituiscilo con il nome della risorsa MIG appropriato, ad nvidia.com/gpu esempio. nvidia.com/mig-1g.10gb Per ulteriori informazioni, consulta Invio di attività con MIG.

      cat <<EOF> deploy_s3_inference.yaml
      ---
      apiVersion: inference.sagemaker.aws.amazon.com/v1alpha1
      kind: InferenceEndpointConfig
      metadata:
        name: $SAGEMAKER_ENDPOINT_NAME
        namespace: $CLUSTER_NAMESPACE
      spec:
        modelName: deepseek15b
        endpointName: $SAGEMAKER_ENDPOINT_NAME
        instanceType: ml.g5.8xlarge
        invocationEndpoint: invocations
        modelSourceConfig:
          modelSourceType: s3
          s3Storage:
            bucketName: $S3_MODEL_LOCATION
            region: $REGION
          modelLocation: deepseek15b
          prefetchEnabled: true
        worker:
          resources:
            limits:
              nvidia.com/gpu: 1
              # For MIG-enabled instances, use: nvidia.com/mig-1g.10gb: 1
            requests:
              nvidia.com/gpu: 1
              # For MIG-enabled instances, use: nvidia.com/mig-1g.10gb: 1
              cpu: 25600m
              memory: 102Gi
          image: 763104351884.dkr.ecr.us-east-2.amazonaws.com/djl-inference:0.32.0-lmi14.0.0-cu124
          modelInvocationPort:
            containerPort: 8000
            name: http
          modelVolumeMount:
            name: model-weights
            mountPath: /opt/ml/model
          environmentVariables:
            - name: PYTHONHASHSEED
              value: "123"
            - name: OPTION_ROLLING_BATCH
              value: "vllm"
            - name: SERVING_CHUNKED_READ_TIMEOUT
              value: "480"
            - name: DJL_OFFLINE
              value: "true"
            - name: NUM_SHARD
              value: "1"
            - name: SAGEMAKER_PROGRAM
              value: "inference.py"
            - name: SAGEMAKER_SUBMIT_DIRECTORY
              value: "/opt/ml/model/code"
            - name: MODEL_CACHE_ROOT
              value: "/opt/ml/model"
            - name: SAGEMAKER_MODEL_SERVER_WORKERS
              value: "1"
            - name: SAGEMAKER_MODEL_SERVER_TIMEOUT
              value: "3600"
            - name: OPTION_TRUST_REMOTE_CODE
              value: "true"
            - name: OPTION_ENABLE_REASONING
              value: "true"
            - name: OPTION_REASONING_PARSER
              value: "deepseek_r1"
            - name: SAGEMAKER_CONTAINER_LOG_LEVEL
              value: "20"
            - name: SAGEMAKER_ENV
              value: "1"
            - name: MODEL_SERVER_TYPE
              value: "vllm"
            - name: SESSION_KEY
              value: "x-user-id"
      EOF
    Using Amazon S3 as the model source
    1. Imposta un nome per l'endpoint. SageMaker

      export SAGEMAKER_ENDPOINT_NAME="deepseek15b-s3"
    2. Configura la posizione del bucket Amazon S3 in cui si trova il modello.

      export S3_MODEL_LOCATION="deepseek-qwen-1-5b"
    3. Di seguito è riportato un file yaml di esempio per la creazione di un endpoint con Amazon S3 e un modello. DeepSeek

      cat <<EOF> deploy_s3_inference.yaml
      ---
      apiVersion: inference.sagemaker.aws.amazon.com/v1
      kind: InferenceEndpointConfig
      metadata:
        name: lmcache-test
        namespace: inf-update
      spec:
        modelName: Llama-3.1-8B-Instruct
        instanceType: ml.g5.24xlarge
        invocationEndpoint: v1/chat/completions
        replicas: 2
        modelSourceConfig:
          modelSourceType: s3
          s3Storage:
            bucketName: bugbash-ada-resources
            region: us-west-2
          modelLocation: models/Llama-3.1-8B-Instruct
          prefetchEnabled: false
        kvCacheSpec:
          enableL1Cache: true
      #    enableL2Cache: true
      #    l2CacheSpec:
      #      l2CacheBackend: redis/sagemaker
      #      l2CacheLocalUrl: redis://redis.redis-system.svc.cluster.local:6379
        intelligentRoutingSpec:
          enabled: true
        tlsConfig:
          tlsCertificateOutputS3Uri: s3://sagemaker-lmcache-fceb9062-tls-6f6ee470
        metrics:
          enabled: true
          modelMetrics:
            port: 8000
        loadBalancer:
          healthCheckPath: /health
        worker:
          resources:
            limits:
              nvidia.com/gpu: "4"
            requests:
              cpu: "6"
              memory: 30Gi
              nvidia.com/gpu: "4"
          image: lmcache/vllm-openai:latest
          args:
            - "/opt/ml/model"
            - "--max-model-len"
            - "20000"
            - "--tensor-parallel-size"
            - "4"
          modelInvocationPort:
            containerPort: 8000
            name: http
          modelVolumeMount:
            name: model-weights
            mountPath: /opt/ml/model
          environmentVariables:
            - name: PYTHONHASHSEED
              value: "123"
            - name: OPTION_ROLLING_BATCH
              value: "vllm"
            - name: SERVING_CHUNKED_READ_TIMEOUT
              value: "480"
            - name: DJL_OFFLINE
              value: "true"
            - name: NUM_SHARD
              value: "1"
            - name: SAGEMAKER_PROGRAM
              value: "inference.py"
            - name: SAGEMAKER_SUBMIT_DIRECTORY
              value: "/opt/ml/model/code"
            - name: MODEL_CACHE_ROOT
              value: "/opt/ml/model"
            - name: SAGEMAKER_MODEL_SERVER_WORKERS
              value: "1"
            - name: SAGEMAKER_MODEL_SERVER_TIMEOUT
              value: "3600"
            - name: OPTION_TRUST_REMOTE_CODE
              value: "true"
            - name: OPTION_ENABLE_REASONING
              value: "true"
            - name: OPTION_REASONING_PARSER
              value: "deepseek_r1"
            - name: SAGEMAKER_CONTAINER_LOG_LEVEL
              value: "20"
            - name: SAGEMAKER_ENV
              value: "1"
            - name: MODEL_SERVER_TYPE
              value: "vllm"
            - name: SESSION_KEY
              value: "x-user-id"
      EOF

Configura la memorizzazione nella cache KV e il routing intelligente per migliorare le prestazioni

  1. Abilita la memorizzazione nella cache KV impostando enableL1Cache e enableL2Cache su true .Quindi, imposta redis e aggiorna l2CacheLocalUrl con l'URL del l2CacheSpec cluster Redis.

    kvCacheSpec: enableL1Cache: true enableL2Cache: true l2CacheSpec: l2CacheBackend: <redis | tieredstorage> l2CacheLocalUrl: <redis cluster URL if l2CacheBackend is redis >
    Nota

    Se il cluster redis non si trova all'interno dello stesso Amazon VPC HyperPod del cluster, la crittografia dei dati in transito non è garantita.

    Nota

    Non è necessario l2 CacheLocalUrl se è selezionato lo storage su più livelli.

  2. Abilita il routing intelligente impostando su under. enabled true intelligentRoutingSpec È possibile specificare la strategia di routing da utilizzare. routingStrategy Se non viene specificata alcuna strategia di routing, l'impostazione predefinita è. prefixaware

    intelligentRoutingSpec: enabled: true routingStrategy: <routing strategy to use>
  3. Abilita le metriche del router e le metriche di memorizzazione nella cache impostando su under. enabled true metrics Il port valore deve essere uguale al valore inferiore. containerPort modelInvocationPort

    metrics: enabled: true modelMetrics: port: <port value> ... modelInvocationPort: containerPort: <port value>

Implementa il tuo modello da Amazon S3 o Amazon FSx

  1. Ottieni il nome del cluster Amazon EKS dall'ARN del HyperPod cluster per l'autenticazione kubectl.

    export EKS_CLUSTER_NAME=$(aws --region $REGION sagemaker describe-cluster --cluster-name $HYPERPOD_CLUSTER_NAME \ --query 'Orchestrator.Eks.ClusterArn' --output text | \ cut -d'/' -f2) aws eks update-kubeconfig --name $EKS_CLUSTER_NAME --region $REGION
  2. Implementa il tuo InferenceEndpointConfig modello con una delle seguenti opzioni:

    Deploy with Amazon FSx as a source
    kubectl apply -f deploy_fsx_luster_inference.yaml
    Deploy with Amazon S3 as a source
    kubectl apply -f deploy_s3_inference.yaml

Verifica dello stato dell’implementazione

  1. Verifica se il modello è stato implementato correttamente.

    kubectl describe InferenceEndpointConfig $SAGEMAKER_ENDPOINT_NAME -n $CLUSTER_NAMESPACE
  2. Verifica che l’endpoint sia stato creato correttamente.

    kubectl describe SageMakerEndpointRegistration $SAGEMAKER_ENDPOINT_NAME -n $CLUSTER_NAMESPACE
  3. Testa l’endpoint implementato per verificare che funzioni correttamente. Questa fase conferma che il modello è stato implementato correttamente e può elaborare le richieste di inferenza.

    aws sagemaker-runtime invoke-endpoint \ --endpoint-name $SAGEMAKER_ENDPOINT_NAME \ --content-type "application/json" \ --body '{"inputs": "What is AWS SageMaker?"}' \ --region $REGION \ --cli-binary-format raw-in-base64-out \ /dev/stdout

Gestione dell’implementazione

Al termine dei test sull’implementazione, utilizza i comandi seguenti per pulire le risorse.

Nota

Verifica di non aver più bisogno del modello implementato o dei dati archiviati prima di procedere.

Pulizia delle risorse
  1. Elimina l’implementazione dell’inferenza e le risorse Kubernetes associate. Ciò interrompe l'esecuzione dei contenitori del modello e rimuove l' SageMakerendpoint.

    kubectl delete inferenceendpointconfig $SAGEMAKER_ENDPOINT_NAME -n $CLUSTER_NAMESPACE
  2. Verifica che la pulizia sia stata eseguita correttamente.

    # # Check that Kubernetes resources are removed kubectl get pods,svc,deployment,InferenceEndpointConfig,sagemakerendpointregistration -n $CLUSTER_NAMESPACE
    # Verify SageMaker endpoint is deleted (should return error or empty) aws sagemaker describe-endpoint --endpoint-name $SAGEMAKER_ENDPOINT_NAME --region $REGION
risoluzione dei problemi

Utilizza questi comandi di debug se l’implementazione non funziona come previsto.

  1. Controlla lo stato dell’implementazione di Kubernetes.

    kubectl describe deployment $SAGEMAKER_ENDPOINT_NAME -n $CLUSTER_NAMESPACE
  2. Controlla lo InferenceEndpointConfig stato per vedere lo stato di implementazione di alto livello e gli eventuali problemi di configurazione.

    kubectl describe InferenceEndpointConfig $SAGEMAKER_ENDPOINT_NAME -n $CLUSTER_NAMESPACE
  3. Controlla lo stato di tutti gli oggetti Kubernetes. Ottieni una visione completa di tutte le risorse Kubernetes correlate nel tuo namespace. Questa funzionalità ti offre una panoramica rapida su tutto ciò che è in esecuzione e sugli eventuali elementi mancanti.

    kubectl get pods,svc,deployment,InferenceEndpointConfig,sagemakerendpointregistration -n $CLUSTER_NAMESPACE