2024-11-21 一站式 AI 平台生日大派对!2024-11-21 一站式 AI 平台生日大派对! 无问芯穹特别推出多项超值福利!立即参与
Skip to content

使用自定义镜像部署推理服务

本章节将介绍如何使用自定义镜像部署模型推理服务,并配置内网和外网访问方式。

NOTE

  • 运行推理服务需要预付费计算资源,请提前购买包年/包月/包周/包日资源池。购买方式参见购买、支持与售后。暂不支持按量付费方式。

部署前准备

在部署模型推理服务之前,请确保满足以下条件:

  • 算力资源: 预付费类型资源(包年/包月/包周/包日资源),购买方式参见购买、支持与售后。暂不支持按量付费方式。
  • 存储空间: 请提前评估存储空间需求。推理服务实例 rootfs 提供 50 GiB 本地存储。最佳实践是通过挂载的方式访问共享高性能存储中的模型文件。
  • 模型文件:可提前放置模型文件至共享高性能存储,或指定模型存放目录为共享高性能存储中的目录。

制作自定义镜像

本教程中以常见的第三方推理框架为例,制作自定义镜像。

假设您需要使用 Xinference 框架,只安装必要的推理引擎,可以直接从 AIStudio 平台镜像中心在线构建自定义镜像。

例如,PyTorch(transformers) 引擎支持几乎所有的最新模型。在上方页面点击构建镜像按钮,选择基于 Dockerfile 构建一个只包含 Transformer 引擎的 Xinference 镜像:

dockerfile
FROM cr.infini-ai.com/infini-ai/ubuntu:22.04-20240429

RUN python3 -m pip install --upgrade pip && \
    python3 -m pip install --no-cache-dir "xinference[transformers]" sentence-transformers

又例如,使用支持高并发的高性能大模型推理引擎 vLLM,可使用以下 Dockerfile 构建镜像。

dockerfile
FROM cr.infini-ai.com/infini-ai/ubuntu:22.04-20240429

# Install necessary Python packages with no cache to reduce the image size.
RUN python3 -m pip install --no-cache-dir "xinference[vllm]" \
    && python3 -m pip install --no-cache-dir flashinfer -i https://flashinfer.ai/whl/cu121/torch2.4/

等待自定义镜像构建完成,即可在 AIStudio 平台使用该镜像创建推理服务等。

NOTE

AIStudio 镜像中心还支持其他制作镜像方式。详见构建自定义镜像迁移外部镜像

准备模型文件

最佳实践是提前准备模型文件,并放置模型文件至共享高性能存储。

您可以使用开发机或免费的 AICoder 读写共享高性能存储。以下示例中直接从外部下载了一个模型文件。

shell
# 创建任意目录
mkdir -vp /mnt/public/models
cd /mnt/public/models
# 从 modelscope 下载模型
git lfs install
git clone https://www.modelscope.cn/Qwen/Qwen2.5-0.5B-Instruct.git
# 下载完成后,确保模型目录内存在 .safetensors 文件
ls -alht /mnt/public/models/Qwen2.5-0.5B-Instruct

NOTE

如果您选用的预置推理镜像中的框架支持自动下载模型,且模型文件较小,也可以在启动命令中指定框架将模型下载到实例挂载的共享高性能存储或本地存储中。

创建推理服务

访问智算云控制台的推理服务页面,可创建推理服务。

进入创建页面后,请根据页面提示,完成以下配置。

Step 0 选择算力资源

首先,根据推理服务要求,在您购买的算力资源池中选择合适的 GPU 算力规格、实例数量。

如果算力资源类型为资源池,平台会列出租户下的所有资源池,在资源池右侧可直接查看空闲可用卡数。

alt text

您购买的资源池中可能包含一种或多种实例规格。您需要选择运行服务的计算资源规格。每种规格对应一个特定的 CPU、显卡、内存配置组合。

  • 实例数量: 预期运行的实例数。实例数大于 1 时自动提供负载均衡。仅在当前资源池可用实例大于等于 1 时,该推理服务可部署成功。
  • 滚动更新: 设置最大不可用百分比,该参数仅影响服务升级与回滚。在开发测试阶段,单实例的情况下可设置为 0,多实例的情况下可设置为 50%。详细说明请移步升级服务

NOTE

选择资源池后,平台会根据负载规格计算剩余可启动数量。例如,负载规格 NVIDIA A100-40-NVLinK 显卡数量 1 的可启动数量为 9,表示资源池内的剩余资源可供创建 9 个同规格实例。最佳实践是根据 检查资源占用情况 确保当前资源池的剩余资源足够满足任务启动需求。

Step 1 配置镜像和启动命令

如果使用自定义镜像,请根据当前推理环境,编写服务的「启动命令」。以 Xinference + transformer 引擎为例,启动一个 JINA AI 的向量嵌入模型 jina-embeddings-v2-base-zh

alt text

因为 embedding 模型较小,可让 Xinference 在启动模型时直接从 modelscope 下载。完整启动命令如下

shell
#!/bin/bash

# 环境变量设置
export XINFERENCE_MODEL_SRC=modelscope
export HF_ENDPOINT=https://hf-mirror.com

# 创建并设置 Xinference 主目录
XINFERENCE_CACHE_DIR="/mnt/public/xinference-cache"
if [ ! -d "$XINFERENCE_CACHE_DIR" ]; then
    mkdir -pv "$XINFERENCE_CACHE_DIR"
fi
export XINFERENCE_HOME="$XINFERENCE_CACHE_DIR"

# 创建日志目录
LOG_DIR="${XINFERENCE_CACHE_DIR}/logs"
mkdir -p "$LOG_DIR"
LOCAL_LOG="${LOG_DIR}/xinference-local.log"

# 定义日志前缀函数
add_prefix() {
    while IFS= read -r line; do
        echo "[$(date '+%Y-%m-%d %H:%M:%S')] $line"
    done
}

echo "正在启动 Xinference 服务..."
# 将xinference-local作为主进程运行,而不是放在后台
xinference-local --host 0.0.0.0 --port 9997 2>&1 | tee "$LOCAL_LOG" | add_prefix &

# 等待服务可用
echo "等待服务就绪..."
max_attempts=60
attempt=0
while ! curl -s http://127.0.0.1:9997 > /dev/null; do
    attempt=$((attempt + 1))
    if [ $attempt -eq $max_attempts ]; then
        echo "服务启动超时,请检查日志: $LOCAL_LOG"
        exit 1
    fi
    echo "等待服务启动... (${attempt}/${max_attempts})"
    sleep 1
done

echo "服务已就绪,正在加载模型..."
xinference launch --model-name jina-embeddings-v2-base-zh --model-type embedding --model-engine transformers

echo "模型已加载,服务继续运行中..."
echo "可以通过 'tail -f ${LOCAL_LOG}' 查看服务日志"
echo "按 Ctrl+C 停止服务"

# 等待后台服务
wait

虽然可以直接在启动命令窗口中编写启动服务的代码,但更推荐将启动命令封装成脚本,放置在共享高性能存储,从启动命令中引用。

TIP

请特别注意容器的生命周期管理,在启动命令中需要有一个前台运行的主进程。如果全部服务均被放入后台,当容器的启动命令执行完毕,平台会认为容器的主进程已经结束,导致容器陷入销毁与创建的循环。

Step 2 挂载共享高性能存储

推理服务依赖的模型和代码可放置在共享高性能存储中。创建推理服务时,可保持平台默认创建的挂载点。

alt text

  • 系统盘: 推理服务实例的 / 目录的存储大小,固定 50GB。
  • 高性能存储:挂载租户的共享高性能存储(例如,您可以将模型文件放在共享高性能存储中)。详见共享高性能存储

Step 3 配置网络

配置推理服务是否支持从公网访问访问,监听端口以及内网访问端口。

外网配置

启用外网访问,一般选择默认地址即可。推理服务创建成功后,平台将自动生成租户下唯一访问地址,地址中带有当前推理服务的 ID。

格式: https://cloud.infini-ai.com/AIStudio/inference/api/<推理服务ID>/

alt text

NOTE

选择 自定义地址 后,可自定义 URL 中的部分路径,但无法支持自定义域名。推理服务创建成功后,地址中将带有当前租户的 ID 和当前服务的自定义地址。详见访问推理服务

内网配置(端口)

根据您选用的推理框架要求,配置监听端口(默认 8000)和调用端口(默认 80),内网支持 HTTP 访问。

WARNING

  • 请务必根据推理服务要求配置监听端口。本示例中 Xinference 运行在 9997 端口,因此监听端口应修改为 9997。
  • 如需要提供 UI 访问服务,请保留 80 调用端口。本示例中 Xinference 提供 UI 界面,因此调用端口保留了 80。

Step 4 高级配置

推理服务支持自动扩缩容定时扩缩容。首次部署服务时,建议保持扩缩容关闭状态,先完成服务部署流程。

NOTE

后续根据实际情况选择手动扩缩容、定时扩缩容或自动扩缩容。使用方法详见扩缩容

Step 5 填写基本信息

最后填写推理服务的名称与描述。

  • 名称: 推理服务名称,最多 64 个字符,支持中英文数字以及- _。
  • 描述(可选): 上限 400 字符。

根据模型参数量,所需部署时间可能有差异。推理服务进入部署中状态后,将会执行一系列耗时的子操作。如果进度长期停留在部署中状态,建议查看详细部署进度。

查看部署进度

推理进入部署中状态后,将会执行一系列子操作。只要当前推理服务有一个实例完成所有子操作,即可运行成功。

如果部署进度长时间停留在部署中状态,建议在推理服务列表的状态栏中点击 ... 图标,在打开的弹窗中查看详细进度。

如果在任何子状态发生错误,平台会自动重试。如果进度长时间停留在错误状态且无法恢复,建议停止推理服务,并重新发起。如果问题持续存在,请联系售后服务。

alt text

常见问题

请移步推理服务常见问题

参考资料

我们整理常见开源推理框架在 AIStudio 平台的安装教程。您可以在 AIStudio 开发机中安装环境后,保存开发机为镜像。或者根据以下教程中的提示,自行制作 Dockerfile,用于在平台中构建自定义镜像。