FSx 使用 kubectl 部署来自亚马逊 S3 和亚马逊的自定义微调模型 - 亚马逊 SageMaker AI

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

FSx 使用 kubectl 部署来自亚马逊 S3 和亚马逊的自定义微调模型

以下步骤向您展示了如何使用 kubectl 将存储在 Amazon S3 或亚马逊上的模型部署 FSx 到亚马逊 SageMaker HyperPod 集群。

以下指令包含专为在终端中运行而设计的代码单元和命令。在执行这些命令之前,请确保已使用 AWS 凭据配置您的环境。

先决条件

在开始之前,请确认您已经:

设置和配置

将所有占位符值替换为实际资源标识符。

  1. 在您的环境中选择您的区域。

    export REGION=<region>
  2. 初始化您的集群名称。这标识了您的模型将在哪个 HyperPod 集群中部署。

    注意

    请咨询您的集群管理员,确保已为该角色或用户授予权限。你可以运行!aws sts get-caller-identity --query "Arn"来检查你在终端中使用的是哪个角色或哪个用户。

    # 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. 初始化集群命名空间。您的集群管理员应该已经在您的命名空间中创建了 hypod-Inference 服务账户。

    cluster_namespace="<namespace>"
  4. 使用以下选项之一创建 CRD:

    Using Amazon FSx as the model source
    1. 设置 SageMaker 端点名称。

      export SAGEMAKER_ENDPOINT_NAME="deepseek15b-fsx"
    2. 配置要使用的亚马逊 FSx 文件系统 ID。

      export FSX_FILE_SYSTEM_ID="fs-1234abcd"
    3. 以下是使用 Amazon FSx 和 DeepSeek 模型创建终端节点的 yaml 文件示例。

      cat <<EOF> deploy_fsx_cluster_inference.yaml
      ---
      apiVersion: inference.sagemaker.aws.amazon.com/v1alpha1
      kind: InferenceEndpointConfig
      metadata:
        name: $SAGEMAKER_ENDPOINT_NAME
        namespace: $CLUSTER_NAMESPACE
      spec:
        endpointName: $SAGEMAKER_ENDPOINT_NAME
        instanceType: $INSTANCE_TYPE
        invocationEndpoint: invocations
        modelName: deepseek15b
        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
            requests:
              cpu: 30000m
              memory: 100Gi
              nvidia.com/gpu: 1
      EOF
    Using Amazon S3 as the model source
    1. 设置 SageMaker 端点名称。

      export SAGEMAKER_ENDPOINT_NAME="deepseek15b-s3"
    2. 配置模型所在的 Amazon S3 存储桶位置。

      export S3_MODEL_LOCATION="deepseek-qwen-1-5b"
    3. 以下是使用 Amazon S3 和 DeepSeek 模型创建终端节点的 yaml 文件示例。

      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
            requests:
              nvidia.com/gpu: 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: 8080
            name: http
          modelVolumeMount:
            name: model-weights
            mountPath: /opt/ml/model
          environmentVariables:
            - 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"
      EOF

从 Amazon S3 或亚马逊部署您的模型 FSx

  1. 从集群 ARN 中获取用于 kubectl 身份验证的 Amazon EKS HyperPod 集群名称。

    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. 使用以下选项之一部署 InferenceEndpointConfig 模型:

    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

验证您的部署状态

  1. 检查模型是否成功部署。

    kubectl describe InferenceEndpointConfig $SAGEMAKER_ENDPOINT_NAME -n $CLUSTER_NAMESPACE
  2. 检查终端节点是否已成功创建。

    kubectl describe SageMakerEndpointRegistration $SAGEMAKER_ENDPOINT_NAME -n $CLUSTER_NAMESPACE
  3. 测试已部署的端点以验证其是否正常工作。此步骤确认您的模型已成功部署并且可以处理推理请求。

    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

管理您的部署

完成部署测试后,使用以下命令清理资源。

注意

继续操作之前,请确认您不再需要已部署的模型或存储的数据。

清除资源
  1. 删除推理部署和关联的 Kubernetes 资源。这将停止正在运行的模型容器并移除 SageMaker端点。

    kubectl delete inferenceendpointconfig $SAGEMAKER_ENDPOINT_NAME -n $CLUSTER_NAMESPACE
  2. 验证清理是否成功完成。

    # # 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
故障排除

如果您的部署未按预期运行,请使用这些调试命令。

  1. 检查 Kubernetes 部署状态。

    kubectl describe deployment $SAGEMAKER_ENDPOINT_NAME -n $CLUSTER_NAMESPACE
  2. 检查 InferenceEndpointConfig 状态以查看高级部署状态和任何配置问题。

    kubectl describe InferenceEndpointConfig $SAGEMAKER_ENDPOINT_NAME -n $CLUSTER_NAMESPACE
  3. 检查所有 Kubernetes 对象的状态。全面了解你的命名空间中所有相关的 Kubernetes 资源。这可以让你快速了解正在运行的内容和可能缺少的内容。

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