把 Unsloth 量化模型部署到 AWS:EC2、SageMaker、EKS 与 ECS 四种路径

2026-07-10 41 预计阅读时间: 1 分钟
来源: aws.amazon.com AI 摘要 Original link

Disclaimer: This article is an AI-assisted summary. Read it together with the original source when precision matters. The summary may omit context, version differences, or edge cases and is not official documentation.

预计阅读时间:12 分钟

模型完成量化,只解决了显存占用和推理成本的一部分问题。真正进入生产环境时,还要决定由谁管理实例、如何扩缩容、怎样接入现有容器平台,以及如何监控冷启动、显存和请求延迟。对于已经通过 Unsloth 量化的模型,可以根据团队现有基础设施,在 Amazon EC2、Amazon SageMaker AI 推理端点、Amazon EKS 和 Amazon ECS 之间选择。

四种部署模式解决的是不同问题

这四条路径并不是简单的产品替换关系,而是四种不同的运维责任划分。

模式 适合场景 团队需要负责的内容 主要取舍
EC2 调试、自定义运行时、直接访问 GPU 系统、驱动、进程、扩缩容和故障恢复 控制力最强,运维工作最多
SageMaker AI 端点 需要托管推理、标准化发布和扩缩容 模型镜像、制品和端点配置 平台能力完整,但要遵循托管服务接口
EKS 已有 Kubernetes 平台、需要统一调度和治理 集群、控制器、工作负载与 GPU 节点 灵活,平台复杂度较高
ECS 已使用 AWS 容器体系,不需要 Kubernetes 任务定义、服务和容量配置 容器化清晰,编排模型比 EKS 简单

EC2 通常是打通部署链路的第一站。工程师可以登录实例,检查 CUDA、驱动、模型文件和推理进程,适合定位量化模型加载失败、算子不兼容或显存不足等问题。不过,SSH 调试方便并不等于生产可维护;当副本增加后,人工管理进程很快会成为负担。

SageMaker AI 端点把实例生命周期、端点更新和托管服务能力交给平台,更适合希望建立标准发布流程的团队。EKS 与 ECS 则适合模型推理必须进入现有容器框架的情况,例如复用内部网关、服务发现、日志采集和发布审批流程。

先固定模型制品和推理接口

无论选择哪一种运行平台,都建议先把“模型如何加载”和“服务如何响应”固定下来。量化方法、模型文件格式和运行时必须匹配;不能仅因为制品体积变小,就假设任意推理引擎都能直接加载。

一个可移植的交付单元通常包含:

  • 已量化的模型文件、分词器和必要配置;
  • 明确版本的 CUDA、Python 和推理依赖;
  • 健康检查接口;
  • 推理接口及请求上限;
  • 模型加载完成后才返回成功的就绪状态。

可以这样实践:假设团队已经制作了一个能加载 Unsloth 量化制品的自定义镜像,并暴露 8080 端口、/ping 健康检查和 /invocations 推理接口。先在 GPU 主机上验证镜像,再推送到 Amazon ECR。请替换区域、账户 ID、镜像名称和本地模型目录。

set -euo pipefail

AWS_REGION="us-east-1"
AWS_ACCOUNT_ID="123456789012"
IMAGE_NAME="unsloth-inference"
IMAGE_TAG="v1"
IMAGE_URI="${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/${IMAGE_NAME}:${IMAGE_TAG}"
MODEL_DIR="$PWD/model"

aws ecr describe-repositories \
  --region "$AWS_REGION" \
  --repository-names "$IMAGE_NAME" >/dev/null 2>&1 || \
aws ecr create-repository \
  --region "$AWS_REGION" \
  --repository-name "$IMAGE_NAME"

aws ecr get-login-password --region "$AWS_REGION" | \
  docker login \
    --username AWS \
    --password-stdin "${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com"

docker build -t "${IMAGE_NAME}:${IMAGE_TAG}" .
docker run --rm --gpus all -p 8080:8080 \
  -v "${MODEL_DIR}:/opt/model:ro" \
  "${IMAGE_NAME}:${IMAGE_TAG}"

服务启动后,可以在另一个终端进行最小验证:

curl --fail http://localhost:8080/ping

curl --fail http://localhost:8080/invocations \
  -H 'Content-Type: application/json' \
  -d '{"prompt":"Explain quantized inference in two sentences.","max_new_tokens":80}'

这里的接口只是可改造的实践约定,并不代表所有 Unsloth 制品都使用相同的加载方式。实际镜像必须根据模型格式和推理引擎调整。

从 EC2 验证,到 SageMaker 托管端点

在 EC2 上,建议使用启动脚本或系统服务拉起容器,并将模型放在持久化存储或启动时从对象存储下载。不要把模型下载、镜像构建和服务启动混成一个无法观测的长脚本。至少要分别记录下载耗时、模型加载耗时和首次推理耗时。

当镜像接口稳定后,可以迁移到 SageMaker AI。下面是一个可改造的 AWS CLI 流程,假设模型制品已打包上传到 Amazon S3,自定义镜像已推送到 ECR,并且执行角色允许 SageMaker 读取对应资源。实例类型只是占位值,部署前要按模型显存需求替换。

set -euo pipefail

AWS_REGION="us-east-1"
MODEL_NAME="unsloth-quantized-v1"
ENDPOINT_CONFIG="unsloth-quantized-v1-config"
ENDPOINT_NAME="unsloth-quantized-prod"
ROLE_ARN="arn:aws:iam::123456789012:role/SageMakerExecutionRole"
IMAGE_URI="123456789012.dkr.ecr.us-east-1.amazonaws.com/unsloth-inference:v1"
MODEL_DATA_URL="s3://my-model-bucket/unsloth/model.tar.gz"

aws sagemaker create-model \
  --region "$AWS_REGION" \
  --model-name "$MODEL_NAME" \
  --execution-role-arn "$ROLE_ARN" \
  --primary-container "Image=${IMAGE_URI},ModelDataUrl=${MODEL_DATA_URL}"

aws sagemaker create-endpoint-config \
  --region "$AWS_REGION" \
  --endpoint-config-name "$ENDPOINT_CONFIG" \
  --production-variants "VariantName=AllTraffic,ModelName=${MODEL_NAME},InitialInstanceCount=1,InstanceType=ml.g5.xlarge,InitialVariantWeight=1.0"

aws sagemaker create-endpoint \
  --region "$AWS_REGION" \
  --endpoint-name "$ENDPOINT_NAME" \
  --endpoint-config-name "$ENDPOINT_CONFIG"

aws sagemaker wait endpoint-in-service \
  --region "$AWS_REGION" \
  --endpoint-name "$ENDPOINT_NAME"

生产更新时,不要直接覆盖无法追踪的 latest 镜像。为镜像、模型制品和端点配置使用不可变版本,创建新配置后再更新端点。这样出现输出质量下降、运行时崩溃或显存回归时,才能定位并回滚到上一组制品。

在 EKS 或 ECS 中复用容器平台

如果组织已经使用 Kubernetes,EKS 可以把模型服务纳入现有的命名空间、网关、监控和发布策略。下面的清单假设集群已经安装 NVIDIA GPU 设备插件,节点能够拉取 ECR 镜像,并且容器使用一个 GPU。请按实际镜像、节点标签和资源需求修改。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: unsloth-inference
  namespace: model-serving
spec:
  replicas: 1
  selector:
    matchLabels:
      app: unsloth-inference
  template:
    metadata:
      labels:
        app: unsloth-inference
    spec:
      containers:
        - name: server
          image: 123456789012.dkr.ecr.us-east-1.amazonaws.com/unsloth-inference:v1
          ports:
            - name: http
              containerPort: 8080
          resources:
            requests:
              cpu: "2"
              memory: 8Gi
              nvidia.com/gpu: "1"
            limits:
              cpu: "4"
              memory: 16Gi
              nvidia.com/gpu: "1"
          readinessProbe:
            httpGet:
              path: /ping
              port: http
            initialDelaySeconds: 30
            periodSeconds: 10
            failureThreshold: 30
          livenessProbe:
            httpGet:
              path: /ping
              port: http
            initialDelaySeconds: 180
            periodSeconds: 30
      nodeSelector:
        workload: gpu-inference
---
apiVersion: v1
kind: Service
metadata:
  name: unsloth-inference
  namespace: model-serving
spec:
  selector:
    app: unsloth-inference
  ports:
    - name: http
      port: 80
      targetPort: http

应用并观察模型加载过程:

kubectl create namespace model-serving --dry-run=client -o yaml | kubectl apply -f -
kubectl apply -f unsloth-inference.yaml
kubectl rollout status deployment/unsloth-inference -n model-serving --timeout=20m
kubectl logs -n model-serving deployment/unsloth-inference --follow

模型加载可能持续数分钟,因此就绪探针和存活探针不能使用同一套激进阈值。否则,容器还在加载权重时就会被反复重启。ECS 中也应采用同样的设计原则:在任务定义中声明 GPU 和内存需求,让服务调度任务,并通过负载均衡器健康检查控制流量进入。选择 ECS 的关键理由通常不是模型性能更高,而是团队已经围绕 ECS 建立了镜像、网络、权限和日志体系。

上线前检查延迟、容量和回滚能力

量化降低了资源需求,但不会自动解决所有生产问题。上下文长度、并发请求数、批处理策略和生成 token 数仍会显著影响显存与尾延迟。部署前至少完成以下检查:

  • 在目标 GPU 上验证模型能够完整加载,并记录峰值显存;
  • 分别测试短输入、长输入和最大输出长度;
  • 记录冷启动、首 token 延迟、总延迟和吞吐量;
  • 为输入长度、输出 token 和并发数设置明确上限;
  • 监控 GPU 利用率、显存、容器重启、错误率和排队时间;
  • 使用不可变镜像标签与模型版本,保留上一版本的配置;
  • 在生产流量进入前验证健康检查不会过早放行;
  • 检查 IAM、网络边界、日志脱敏和模型制品访问权限。

如果团队还没有成熟的容器平台,可以先用 EC2 验证镜像和模型兼容性,再迁移到 SageMaker AI 端点减少实例运维。已有 Kubernetes 治理体系时,EKS 更容易复用平台能力;已经标准化 ECS 的团队则无需为了一个推理服务额外引入 Kubernetes。最终选择应由运维边界、发布流程和流量特征决定,而不是只比较单次推理速度。


相关推荐