模型部署操作
更新时间:2023-12-28
在完成模型的训练后,可以通过模型部署能力快速测试。
前提条件
模型部署前,请确保您已成功创建资源池。
操作步骤
- 登录百舸异构计算平台AIHC控制台。
- 进入模型部署列表页面,点击新建按钮,创建模型部署。
- 填写模型服务信息:
参数 | 说明 |
---|---|
名称 | 模型部署实例的名称。支持小写字母、数字以及 - 且开头必须是小写字母,结尾必须是小写字母或数字,长度1-50 |
资源池 | 选择模型部署所在的资源池 |
队列 | 选择模型部署所在的队列 |
部署方式 | 目前仅支持AIAK加速引擎的方式部署模型,支持LLAMA2、CodeLlama、ChatGLM2、Baichuan1、Baichuan2和Qwen模型部署 AIAK加速引擎是百舸异构计算平台针对于大模型推理场景,推出的推理加速能力,覆盖LLaMA2、ChatGLM2、Baichuan2等主流开源大模型,也支持基于以上开源模型再训练或者迭代的模型(支持再训练或者迭代方式:Post-pretrain、SFT、LoRA,暂不支持P-tuning) |
模型配置 | 需要将训练完成的模型权重文件挂载到指定路径,同时支持您自定义tokenizer和自定义模型前处理和后处理过程的extension插件(详见下文自定义extension样例代码)。本期我们支持PFS的并行文件存储的挂载方式,参数如下: 1、PFS挂载路径:模型权重文件、自定义tokenizer和自定义extension在PFS的绝对路径,其中模型权重文件地址必填,自定义tokenizer和自定义extension选填 2、挂载路径:模型权重文件挂载到容器内的路径,默认为 /mnt/model 不可修改;自定义tokenizer挂载到容器内的路径,默认为 /mnt/tokenizer 不可修改;自定义extension挂载到容器内的路径,默认为 /mnt/extension 不可修改; |
推理精度 | 支持Weight Only INT8 ,FP16 ,FP32 的方式 若您首次选择Weight Only INT8推理精度进行推理服务部署,请您务必按照下文“Weight Only INT8量化使用方法”章节操作进行模型量化! |
- 填写资源配置信息:
参数 | 说明 |
---|---|
实例数 | 建议您配置多个实例,以避免单点部署带来的风险。 |
实例配置 | 配置实例的CPU/内存/GPU规格 |
- 访问配置
参数 | 说明 |
---|---|
流量接入方式 | 目前提供两种流量接入方式: 1.VPC内网的访问方式,可以被资源池所在VPC下的其他资源访问。 2.公网访问方式,可以被公网IP的其他资源访问。 备注:首次创建模型部署,自动创建BLB作为流量接入点,将提供VPC内网访问入口, 可以被资源池所在VPC下的其他资源访问。此资源池内后续新建的服务,可以复用此BLB作为流量接入点。若您选择公网访问接入点,自动创建EIP作为公网IP访问入口。 |
异步推理 | 百舸异构计算平台结合百度内部大模型实践,通过异步推理,推出基于Pull的推理请求调度方案,解决大语言模型推理场景中,输出不定长引起的排队耗时长、负载不均衡等问题。 使用说明: 1、为保证队列服务稳定性,推荐使用百度云 云数据库Redis 作为异步推理的存储资源。首次开启此能力,需要您手动填写以上数据库信息,完成关联。 2、云数据库Redis需要和资源池在同一个VPC,以保证资源池可以通过VPC内网访问云数据库 3、后续此资源池内的其他模型部署,开启此能力,会自动复用已关联的数据库资源,无需重复关联 |
数据库推荐配置说明:
以下配置为测试场景推荐的最小配置,实际生产业务使用的配置需要根据您的业务情况评估。如您有此方面的需求,请联系您的商务同学。
参数 | 配置 |
---|---|
地域 | 请选择当前资源池所在的地域 |
引擎类型 | Redis |
版本类型 | 企业版 |
架构类型 | 集群版 |
引擎版本 | 6.0 |
存储类型 | 高性能内存型 |
节点规格 | 规格代码:cache.n1.micro |
分片数量 | 1 |
副本数量 | 2 |
副本只读 | 禁用(OFF) |
私有网络 | 选择资源池所在的VPC |
主节点/从节点 | 保持默认即可 |
负载均衡集群 | 共享集群 |
端口 | 6379,保持默认即可 |
- 单击完成,进行模型部署。
自定义extension样例代码
样例代码如下,您可以参考样例代码,修改具体函数实现,来实现自定义需求,如自定义模型preprocess和postprocess流程等。
注意:extension插件命名必须为"vllm_extension.py"和“template.json”。
vllm_extension.py
# !/usr/bin/env python3
from transformers import AutoTokenizer
from typing import List
import json
class VllmExtension:
def __init__(self): #不能有构造参数,因为自动构建实例的时候不能传入参数;但可以从当前目录获取config
import pathlib
folder_path = pathlib.Path(__file__).parent.resolve()
with open(f'{folder_path}/template.json', encoding='utf-8') as f:
self.template = json.load(f)
def get_tokenizer(self, tokenizer_path: str) -> AutoTokenizer:
return AutoTokenizer.from_pretrained(tokenizer_path, trust_remote_code=True, use_fast=False)
def text_to_tokens(self, tokenizer: AutoTokenizer, text: str) -> List[int]:
text = self.template['prompt'].replace('#CONTENT#', text)
prompt_tokens = tokenizer.encode(text)
return prompt_tokens
def tokens_to_text(self, tokenizer: AutoTokenizer, output_tokens: List[int]) -> str:
return tokenizer.decode(output_tokens, skip_special_tokens=False, clean_up_tokenization_spaces=False)
template.json
{
"prompt": "[Round 1]\n\n问:#CONTENT#\n\n答:"
}
Weight Only INT8量化使用方法
注意:若您选择Weight Only INT8推理精度进行推理服务部署,在第一次部署前(模型权重从未使用量化工具进行量化),请您必须按照以下步骤前置进行模型权重量化。此量化过程会占用一定的CPU资源,根据您选择量化模型的参数量大小不同,预估需要花费十几分钟至1小时左右时间。
您可以选择以下两种方式并按照您的模型权重路径和服务部署的GPU卡数配置对应参数。
容器启动量化工具使用方式
镜像地址:registry.baidubce.com/cce-ai-native/aiak-inference-llm:1.2.4.6
#启动docker
docker run --gpus all -itd --name infer_test --shm-size=32768m --privileged --user=root --network host -v /PATH/TO/MODEL:/mnt/model registry.baidubce.com/cce-ai-native/aiak-inference-llm:1.2.4.6 /bin/bash
#进入docker
docker exec -it infer_test bash
# weight_only_int8 模型量化脚本
cd /workspace/aiak-model-quant-tool
python3 model_quantization.py -i /input_path/ -o /output_path/ -quant_type weight_only_int8 -tp 1
# 参数介绍
-i 原始模型权重输入路径
-o 量化后的模型权重输出路径
-quant_type 量化算法,支持weight_only_int8
-tp 服务部署的GPU卡数,支持1/2/4/8
K8S部署量化工具使用方式
weight_only_int8 权重转化 deployment yaml示例
请注意修改您的原始模型权重输入路径和量化后的模型权重输出路径,参数介绍同上。
apiVersion: apps/v1
kind: Deployment
metadata:
name: vllm-quantization
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: vllm-quantization
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
labels:
app: vllm-quantization
spec:
containers:
- command:
- /bin/bash
- '-c'
- "sleep inf"
# - "cd /workspace/aiak-model-quant-tool && python3 model_quantization.py -i /input_path/ -o /output_path/ -quant_type weight_only_int8 -tp 1"
image: 'registry.baidubce.com/cce-ai-native/aiak-inference-llm:1.2.4.6'
imagePullPolicy: Always
name: vllm
# resources:
# limits:
# baidu.com/a100_80g_cgpu: "1"
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /mnt/pfs
name: pfs
- mountPath: /dev/shm
name: cache-volume
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: volcano
securityContext: {}
terminationGracePeriodSeconds: 60
volumes:
- name: pfs
persistentVolumeClaim:
claimName: pvc-pfs
- emptyDir:
medium: Memory
name: cache-volume