AI 技术正在引领科技翻新浪潮,随着 ChatGPT 和 Midjourney 的走红,AIGC 技术正在世界范畴内掀起一股 AI 技术浪潮。开源畛域也涌现了许多相似模型,如 FastGPT、Moss、Stable Diffusion 等。这些模型展现出的惊人成果吸引企业和开发者们投身其中,然而简单繁琐的部署形式成为了拦路虎。阿里云 ASK 提供 Serverless 化的容器服务,用户无需关怀资源及环境配置,能够帮忙开发者们零门槛疾速部署 AI 模型。本文以开源的 FastChat 为例,具体展现如何在 ASK 中疾速搭建一个私人代码助理。
成果预览
Cursor + GPT-4 的代码生成是不是感觉很智能,咱们通过 FastChat + VSCode 插件也能做到一样的成果!
- 疾速生成一个 Golang Hello World
地址:https://intranetproxy.alipay.com/skylark/lark/0/2023/gif/1143…
- 疾速生成一个 Kubernetes Deployment
地址:https://intranetproxy.alipay.com/skylark/lark/0/2023/gif/1143…
背景介绍
ASK(Alibaba Serverless Kubernetes)是阿里云容器服务团队提供的一款面向 Serverless 场景的容器产品。用户能够应用 Kubernetes API 间接创立 Workload,免去节点运维懊恼。ASK 作为容器 Serverless 平台,具备免运维、弹性扩容、兼容 K8s 社区、强隔离四大个性。
大规模 AI 利用训练和部署次要面临以下挑战。
- GPU 资源受限且训练老本较高
大规模 AI 利用在训练及推理时都须要应用 GPU,然而很多开发者短少 GPU 资源。独自购买 GPU 卡,或者购买 ECS 实例都须要较高老本。
- 资源异构
并行训练时须要大量的 GPU 资源,这些 GPU 往往是不同系列的。不同 GPU 反对的 CUDA 版本不同,且跟内核版本、nvidia-container-cli 版本互相绑定,开发者须要关注底层资源,为 AI 利用开发减少了许多难度。
- 镜像加载慢
AI 类利用镜像常常有几十 GB,下载往往须要几十分钟甚至数小时。
针对上述问题,ASK 提供了完满的解决方案。在 ASK 中能够通过 Kubernetes Workload 非常不便的应用 GPU 资源,无需其前置筹备应用,用完即可立刻开释,应用成本低。ASK 屏蔽了底层资源,用户无需关怀 GPU、CUDA 版本等等的依赖问题,只需关怀 AI 利用的本身逻辑即可。同时,ASK 默认就提供了镜像缓存能力,当 Pod 第 2 次创立时能够秒级启动。
部署流程
1. 前提条件
已创立 ASK 集群。具体操作,请参见创立 ASK 集群 [1]。
下载 llama-7b 模型并上传到 OSS。具体操作,请参见本文附录局部。
2. 应用 Kubectl 创立
替换 yaml 文件中变量
${your-ak} 您的 AK
${your-sk} 您的 SK
${oss-endpoint-url} OSS 的 enpoint
${llama-oss-path} 替换为寄存 llama-7b 模型的地址(门路开端不须要 /),如 oss://xxxx/llama-7b-hf
apiVersion: v1
kind: Secret
metadata:
name: oss-secret
type: Opaque
stringData:
.ossutilconfig: |
[Credentials]
language=ch
accessKeyID=${your-ak}
accessKeySecret=${your-sk}
endpoint=${oss-endpoint-url}
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: fastchat
name: fastchat
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: fastchat
strategy:
rollingUpdate:
maxSurge: 100%
maxUnavailable: 100%
type: RollingUpdate
template:
metadata:
labels:
app: fastchat
alibabacloud.com/eci: "true"
annotations:
k8s.aliyun.com/eci-use-specs: ecs.gn6e-c12g1.3xlarge
spec:
volumes:
- name: data
emptyDir: {}
- name: oss-volume
secret:
secretName: oss-secret
dnsPolicy: Default
initContainers:
- name: llama-7b
image: yunqi-registry.cn-shanghai.cr.aliyuncs.com/lab/ossutil:v1
volumeMounts:
- name: data
mountPath: /data
- name: oss-volume
mountPath: /root/
readOnly: true
command:
- sh
- -c
- ossutil cp -r ${llama-oss-path} /data/
resources:
limits:
ephemeral-storage: 50Gi
containers:
- command:
- sh
- -c
- "/root/webui.sh"
image: yunqi-registry.cn-shanghai.cr.aliyuncs.com/lab/fastchat:v1.0.0
imagePullPolicy: IfNotPresent
name: fastchat
ports:
- containerPort: 7860
protocol: TCP
- containerPort: 8000
protocol: TCP
readinessProbe:
failureThreshold: 3
initialDelaySeconds: 5
periodSeconds: 10
successThreshold: 1
tcpSocket:
port: 7860
timeoutSeconds: 1
resources:
requests:
cpu: "4"
memory: 8Gi
limits:
nvidia.com/gpu: 1
ephemeral-storage: 100Gi
volumeMounts:
- mountPath: /data
name: data
---
apiVersion: v1
kind: Service
metadata:
annotations:
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type: internet
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-instance-charge-type: PayByCLCU
name: fastchat
namespace: default
spec:
externalTrafficPolicy: Local
ports:
- port: 7860
protocol: TCP
targetPort: 7860
name: web
- port: 8000
protocol: TCP
targetPort: 8000
name: api
selector:
app: fastchat
type: LoadBalancer
3. 期待 FastChat Ready
期待 pod ready 后,在浏览器中拜访 http://${externa-ip}:7860
启动后须要下载 vicuna-7b 模型,模型大小约 13GB
下载模型工夫大略耗时约 20 分钟左右,如果提前做好磁盘快照,通过磁盘快照创立磁盘并挂载到 pod,就是秒级失效
kubectl get po |grep fastchat
# NAME READY STATUS RESTARTS AGE
# fastchat-69ff78cf46-tpbvp 1/1 Running 0 20m
kubectl get svc fastchat
# NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
# fastchat LoadBalancer 192.168.230.108 xxx.xx.x.xxx 7860:31444/TCP 22m
成果展现
Case 1:通过控制台应用 FastChat
在浏览器中拜访 http://${externa-ip}:7860,能够间接测试聊天性能。比方应用自然语言让 FastChat 写一段代码。
输出:基于 Nginx 镜像编写 Kubernetes Deployment Yaml 文件
FastChat 输入如下图所示。
Case 2:通过 API 应用 FastChat
FastChat API 监听在 8000 端口,如下所示,通过 curl 发动一个 API 调用,而后返回后果。
- curl 命令
kubectl get po |grep fastchat
# NAME READY STATUS RESTARTS AGE
# fastchat-69ff78cf46-tpbvp 1/1 Running 0 20m
kubectl get svc fastchat
# NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
# fastchat LoadBalancer 192.168.230.108 xxx.xx.x.xxx 7860:31444/TCP 22m
输入后果
{"id":"3xqtJcXSLnBomSWocuLW2b","object":"chat.completion","created":1682574393,"choices":[{"index":0,"message":{"role":"assistant","content":"上面是应用 Go 语言生成 \"Hello, World!\"的代码:\n```go\npackage main\n\nimport \"fmt\"\n\nfunc main() {\n fmt.Println(\"Hello, World!\")\n}\n```\n 运行该代码后,会输入 \"Hello, World!\"。"},"finish_reason":"stop"}],"usage":null}
Case 3: VSCode 插件
既然有了 API 接口,在 IDE 中怎么疾速集成这个能力呢。你是不是想到了 Copilot、Cursor、Tabnine,那咱们就通过 VSCode 插件集成一下 FastChat 看看吧。VSCode 插件几个外围文件:src/extension.ts、package.json 和 tsconfig.json
这三个文件的内容别离如下:
- src/extension.ts
import * as vscode from 'vscode';
import axios from 'axios';
import {ExtensionContext, commands, window} from "vscode";
const editor = window.activeTextEditor
export function activate(context: vscode.ExtensionContext) {let fastchat = async () => {vscode.window.showInputBox({ prompt: '请输出代码提醒语'}).then((inputValue) => {if (!inputValue) {return;}
vscode.window.withProgress({
location: vscode.ProgressLocation.Notification,
title: '正在申请...',
cancellable: false
}, (progress, token) => {
return axios.post('http://example.com:8000/v1/chat/completions', {
model: 'vicuna-7b-v1.1',
messages: [{role: 'user', content: inputValue}]
}, {
headers: {'Content-Type': 'application/json'}
}).then((response) => {// const content = JSON.stringify(response.data);
const content = response.data.choices[0].message.content;
console.log(response.data)
const regex = /```.*\n([\s\S]*?)```/
const matches = content.match(regex)
if (matches && matches.length > 1) {
editor?.edit(editBuilder => {
let position = editor.selection.active;
position && editBuilder.insert(position, matches[1].trim())
})
}
}).catch((error) => {console.log(error);
});
});
});
}
let command = commands.registerCommand(
"fastchat",
fastchat
)
context.subscriptions.push(command)
}
- package.json
{
"name": "fastchat",
"version": "1.0.0",
"publisher": "yourname",
"engines": {"vscode": "^1.0.0"},
"categories": ["Other"],
"activationEvents": ["onCommand:fastchat"],
"main": "./dist/extension.js",
"contributes": {
"commands": [
{
"command": "fastchat",
"title": "fastchat code generator"
}
]
},
"devDependencies": {
"@types/node": "^18.16.1",
"@types/vscode": "^1.77.0",
"axios": "^1.3.6",
"typescript": "^5.0.4"
}
}
- tsconfig.json
{
"compilerOptions": {
"target": "ES2018",
"module": "commonjs",
"outDir": "./dist",
"strict": true,
"esModuleInterop": true,
"resolveJsonModule": true,
"declaration": true
},
"include": ["src/**/*"],
"exclude": ["node_modules", "**/*.test.ts"]
}
好,插件开发完咱们就看一下成果。
- 疾速生成一个 Golang Hello World
地址:https://intranetproxy.alipay.com/skylark/lark/0/2023/gif/1143…
- 疾速生成一个 Kubernetes Deployment
地址:https://intranetproxy.alipay.com/skylark/lark/0/2023/gif/1143…
总结
ASK 作为容器 Serverless 平台,具备免运维、弹性扩缩容、屏蔽异构资源、镜像减速等能力,非常适合 AI 大模型部署场景,欢送试用。
附录:
1. 下载 llama-7b 模型
模型地址:https://huggingface.co/decapoda-research/llama-7b-hf/tree/main
# 如果应用的是阿里云 ECS,须要运行如下命令装置 git-lfs
# yum install git-lfs
git clone https://huggingface.co/decapoda-research/llama-7b-hf
git lfs install
git lfs pull
2. 上传到 OSS
可参考文档:https://help.aliyun.com/document_detail/195960.html
参考文档:
[1] 创立 ASK 集群
https://help.aliyun.com/document_detail/86377.htm?spm=a2c4g.1…
[2] ASK 概述
https://help.aliyun.com/document_detail/86366.html?spm=a2c4g….
作者:子白、冬岛
原文链接
本文为阿里云原创内容,未经容许不得转载。