腾讯云高性能应用服务 HAI(Hyper Application Inventor) 是一款面向 AI 和科学计算的 GPU/NPU 应用服务产品,提供即插即用的强大算力和常见环境。它可以帮助中小企业和开发者快速部署 AI 大语言模型(LLM)、AI 绘图、数据科学等高性能应用,原生集成配套的开发工具和组件,大大提升应用层的开发生产效率。HAI 作为一款云服务产品,如何提升用户生产力是考虑其使用场景的第一要素。本文就将以此为目标,基于HAI为开发团队打造一款团队内部专属的AI编程助手,提升团队整体研发效率,探索 HAI 在生产力场景下的更多可能性。
基于 HAI 提供的可视化界面以及即插即用的强大算力和常见环境,非AI方向的普通开发者 也可以轻松阅读本文,并着手 打造自己的AI编程助手。
腾讯云高性能应用服务 HAI(Hyper Application Inventor) 是一款面向 AI 和科学计算的 GPU/NPU 应用服务产品,为开发者量身打造的澎湃算力平台。无需复杂配置,便可享受即开即用的 GPU 云服务体验。在 HAI 中,根据应用智能匹配并推选出最适合的 GPU 算力资源,以确保在数据科学、LLM、AI 作画等高性能应用中获得最佳性价比。此外,HAl 的一键部署特性可以在短短几分钟内构建如 StableDifusion、ChatGLM2 等热门模型的应用环境。而对于 AI 研究者,直观的图形界面大大降低了调试的复杂度,支持 jupyterlab、webui 等多种连接方式,助您轻松探索与创新。
高性能应用服务 HAI 的核心服务优势在于三点:智能选型、一键部署、可视化界面。
高性能应用服务 HAI 相比传统 GPU 云服务器的主要区别和优势可以参考下图:
CodeShell 是北京大学知识计算实验室联合四川天府银行 AI 团队研发的 多语言代码大模型基座。CodeShell 具有 70 亿参数,在五千亿 Tokens 进行了训练,上下文窗口长度为 8192。在权威的代码评估 Benchmark(HumanEval 与 MBPP)上,CodeShell 取得同等规模最好的性能。与此同时,CodeShell 提供了与大模型配套的部署方案与 IDE 插件。部署方案涵盖了基于团队 GPU 部署、个人 GPU 部署、个人 CPU 部署三个场景,IDE 插件支持 Python、Java、C++/C、JavaScript、Go 等多种编程语言,为开发者提供代码补全、代码解释、代码优化、注释生成、对话问答等功能。
本文将采用 CodeShell 提供的团队 GPU 部署方案,在 HAI 上进行部署实践。团队 GPU 部署方案基于 text-generation-inference(TGI) 实现服务器高效推理,使用 CodeShell-7B-Chat 模型文件来获得更好的软件工程领域的 AI 智能辅助体验。
按照 CodeShell 团队的公开演讲内容,团队 GPU 部署方案在 4090 上响应速率可达每秒 90Token。每块 4090 可支持上百人的团队日常使用。4090 显卡的显存规格是 24GB,而 HAI 进阶型算力方案 提供了 32GB+的显存。这意味着每小时 2.41 元的成本,即可让上百人的研发团队都使用上 AI 编程助手从而提高研发效率,性价比极高。
接下来,就让我们正式开始部署过程,整个部署过程拆解如下:
序号 | 配置项 | 配置规格 | 说明 |
---|---|---|---|
1 | 应用类型 | AI 框架:Pytorch2.0.0 | 环境配置:Ubuntu20.04, Python 3.8, Pytorch 2.0.0, CUDA 11.7, cuDNN 8, JupyterLab |
2 | 地域 | 广州 | 广州地区支持学术加速及关机不计费功能 |
3 | 算力方案 | 进阶型 | 本文使用非量化版本的 7B 模型+TGI 推理,因此选择进阶型算力方案;如果个人使用,可以选择基础型算力方案搭配 4Bit 量化模型+llama_cpp_for_codeshell 推理 |
4 | 硬盘 | 90G | 默认的 80G 空间在后续部署完成后会出现空间不足的情况,适当增加磁盘大小 |
# 安装git-lfs
apt-get install git-lfs -y
# 进入root目录
cd /root
# 初始化Git LFS,此处会有一个Error输出,忽略即可
git lfs install
# 从国内镜像下载CodeShell-7B-Chat模型文件
# 备用链接:https://wisemodel.cn/WisdomShell/CodeShell-7B-Chat.git
git lfs clone --depth 1 https://www.modelscope.cn/WisdomShell/CodeShell-7B-Chat.git
Tips:模型文件大概 14.5G 左右,在 HAI 提供的带宽只有 5M 的情况下,下载时间较久(50 分钟左右),因此可以新开一个终端窗口进行下一步:部署 TGI 服务
text-generation-inference(TGI)是 Hugging Face 发布的 LLM 开源推理部署框架,使用 Rust、Python 和 gRPC 构建。TGI 具备完整的 Web 体系,包括 Lanuchr(启动器)、Router(路由中间件)、Server(Python gRPC 服务),可以帮助用户完成启动、路由、调度请求、并发请求等相关操作。TGI 还提供了推理加速组件,包括 Flash-Attention、Page-Attention、Continuous Batching、模型并行。
下载 text-generation-inference 项目的 CodeShell 分支
# Clone TGI
git clone https://github.com/WisdomShell/text-generation-inference.git
cd text-generation-inference
安装一些后续步骤需要用到的工具包
apt-get install pkg-config openssl libssl-dev gcc curl -y
vim ~/.bashrc
# 设置rust镜像
export RUSTUP_DIST_SERVER="https://rsproxy.cn"
export RUSTUP_UPDATE_ROOT="https://rsproxy.cn/rustup"
export PATH="$HOME/.cargo/bin:$PATH"
# 刷新环境变量
source ~/.bashrc
# 安装Rust环境
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
中途会出现安装方案的选择提示,选择默认方案,输入 1,回车继续
# 安装成功后,手动执行命令使当前终端环境变量生效
source "$HOME/.cargo/env"
vim ~/.cargo/config
# 配置cargo镜像源
[source.crates-io]
replace-with = 'rsproxy-sparse'
[source.rsproxy]
registry = "https://rsproxy.cn/crates.io-index"
[source.rsproxy-sparse]
registry = "sparse+https://rsproxy.cn/index/"
[registries.rsproxy]
index = "https://rsproxy.cn/crates.io-index"
[net]
git-fetch-with-cli = true
#安装Protoc
PROTOC_ZIP=protoc-21.12-linux-x86_64.zip
curl -OL https://github.com/protocolbuffers/protobuf/releases/download/v21.12/$PROTOC_ZIP
unzip -o $PROTOC_ZIP -d /usr/local bin/protoc
unzip -o $PROTOC_ZIP -d /usr/local 'include/*'
rm -f $PROTOC_ZIP
# 检查版本验证是否安装成功
protoc --version
# 从左侧文件管理器点击进入/root/text-generation-inference/server/目录
# 将Makefile文件的第21行替换为如下命令:
pip install torch torchvision torchaudio -f https://mirror.sjtu.edu.cn/pytorch-wheels/cu118/torch_stable.html
# 创建Python3.9环境
conda create -n text-generation-inference python=3.9
#激活环境
conda activate text-generation-inference
# 编译安装TGI,此过程耗时较久,请耐心等待~~
cd /root/text-generation-inference
BUILD_EXTENSIONS=True make install
# 查看版本检查是否安装成功
text-generation-launcher --version
# 从左侧文件管理器点击进入/root/text-generation-inference/目录
# 将Makefile文件的第52行替换为如下命令:
text-generation-launcher --model-id /root/CodeShell-7B-Chat --port 3030 --num-shard 1 --max-total-tokens 5000 --max-input-length 4096 --max-stop-sequences 12 --trust-remote-code
# --model-id为本地模型文件所在路径
# --port 为TGI服务端口
# 其余参数保持默认即可
# 启动服务:大概需要5-10分钟左右才能启动成功
cd /root/text-generation-inference/
make run-codeshell
#关机后再次开机
cd /root/text-generation-inference/
conda activate text-generation-inference
make run-codeshell
配置 HAI 安全组规则,将 TGI 服务的 3030 端口设置为允许公网访问。
注意:此处将 TGI 服务暴露于公网仅为了方便演示及测试。 直接将 TGI 服务向公网开放是不安全的操作,可能会引起一系列的安全问题。生产环境使用时请参考后文 5.2 章节进行相关安全优化
入站规则配置完成后,可以在浏览器打开 TGI 接口文档验证服务运行情况,TGI 接口文档地址:http://HAI公网IP:3030/docs/
Code Shell 实现并开源了 IDE(VS Code 与 JetBrains) 插件,打通了开发者使用大模型的“最后一公里”。开发者可以在 VS Code 与 JetBrains 的开发者商店中搜索“Code Shell”下载插件。
插件安装成功后,配置 TGI 服务地址等:
在编辑器中选中一段代码,在鼠标右键 CodeShell 菜单中选择对应的功能项,插件将在问答界面中给出相应的答复。
在编码过程中,当停止输入时,代码补全建议可自动触发(在配置选项 Auto Completion Delay 中可设置为 1~3 秒),或者也可以主动触发代码补全建议,使用快捷键 Alt+\
(对于 Windows 电脑)或 option+\
(对于 Mac 电脑)。当插件提供代码建议时,建议内容以灰色显示在编辑器光标位置,可以按下 Tab 键来接受该建议,或者继续输入以忽略该建议。
# 安装benchmark
conda activate text-generation-inference
cd /root/text-generation-inference
make install-benchmark
# 先启动TGI服务
conda activate text-generation-inference
cd /root/text-generation-inference
make run-codeshell
# 等待TGI服务启动成功后,开启一个新的终端窗口,执行text-generation-benchmark
conda activate text-generation-inference
cd /root/text-generation-inference
text-generation-benchmark --tokenizer-name /root/CodeShell-7B-Chat
2023-12-07T04:58:06.759860Z INFO text_generation_benchmark: benchmark/src/main.rs:155: Tokenizer loaded
2023-12-07T04:58:06.765350Z INFO text_generation_benchmark: benchmark/src/main.rs:164: Connect to model server
2023-12-07T04:58:06.777364Z INFO text_generation_benchmark: benchmark/src/main.rs:173: Connected
| Parameter | Value |
|--------------------|-------------------------|
| Model | /root/CodeShell-7B-Chat |
| Sequence Length | 10 |
| Decode Length | 8 |
| Top N Tokens | None |
| N Runs | 10 |
| Warmups | 1 |
| Temperature | None |
| Top K | None |
| Top P | None |
| Typical P | None |
| Repetition Penalty | None |
| Watermark | false |
| Do Sample | false |
| Step | Batch Size | Average | Lowest | Highest | p50 | p90 | p99 |
|----------------|------------|-----------|-----------|-----------|-----------|-----------|-----------|
| Prefill | 1 | 50.06 ms | 49.33 ms | 50.72 ms | 50.00 ms | 50.72 ms | 50.72 ms |
| | 2 | 52.11 ms | 51.50 ms | 53.28 ms | 52.20 ms | 53.28 ms | 53.28 ms |
| | 4 | 57.67 ms | 56.70 ms | 59.75 ms | 57.73 ms | 59.75 ms | 59.75 ms |
| | 8 | 59.05 ms | 58.87 ms | 59.40 ms | 59.03 ms | 59.40 ms | 59.40 ms |
| | 16 | 73.30 ms | 72.77 ms | 74.18 ms | 73.19 ms | 74.18 ms | 74.18 ms |
| | 32 | 100.92 ms | 99.99 ms | 102.04 ms | 101.01 ms | 102.04 ms | 102.04 ms |
| Decode (token) | 1 | 48.03 ms | 47.51 ms | 49.00 ms | 47.89 ms | 49.00 ms | 49.00 ms |
| | 2 | 50.38 ms | 49.39 ms | 51.78 ms | 50.09 ms | 51.78 ms | 51.78 ms |
| | 4 | 52.48 ms | 50.55 ms | 55.98 ms | 51.58 ms | 55.98 ms | 55.98 ms |
| | 8 | 53.65 ms | 52.57 ms | 54.68 ms | 53.80 ms | 54.68 ms | 54.68 ms |
| | 16 | 56.76 ms | 55.24 ms | 60.45 ms | 56.26 ms | 60.45 ms | 60.45 ms |
| | 32 | 63.68 ms | 62.53 ms | 69.83 ms | 62.97 ms | 69.83 ms | 69.83 ms |
| Decode (total) | 1 | 336.21 ms | 332.56 ms | 343.00 ms | 335.25 ms | 343.00 ms | 343.00 ms |
| | 2 | 352.69 ms | 345.74 ms | 362.47 ms | 350.65 ms | 362.47 ms | 362.47 ms |
| | 4 | 367.36 ms | 353.89 ms | 391.88 ms | 361.07 ms | 391.88 ms | 391.88 ms |
| | 8 | 375.55 ms | 368.02 ms | 382.76 ms | 376.57 ms | 382.76 ms | 382.76 ms |
| | 16 | 397.31 ms | 386.70 ms | 423.16 ms | 393.80 ms | 423.16 ms | 423.16 ms |
| | 32 | 445.75 ms | 437.69 ms | 488.82 ms | 440.78 ms | 488.82 ms | 488.82 ms |
| Step | Batch Size | Average | Lowest | Highest |
|---------|------------|--------------------|--------------------|--------------------|
| Prefill | 1 | 19.98 tokens/secs | 19.72 tokens/secs | 20.27 tokens/secs |
| | 2 | 38.39 tokens/secs | 37.54 tokens/secs | 38.83 tokens/secs |
| | 4 | 69.37 tokens/secs | 66.95 tokens/secs | 70.54 tokens/secs |
| | 8 | 135.49 tokens/secs | 134.69 tokens/secs | 135.89 tokens/secs |
| | 16 | 218.27 tokens/secs | 215.70 tokens/secs | 219.87 tokens/secs |
| | 32 | 317.10 tokens/secs | 313.61 tokens/secs | 320.03 tokens/secs |
| Decode | 1 | 20.82 tokens/secs | 20.41 tokens/secs | 21.05 tokens/secs |
| | 2 | 39.70 tokens/secs | 38.62 tokens/secs | 40.49 tokens/secs |
| | 4 | 76.32 tokens/secs | 71.45 tokens/secs | 79.12 tokens/secs |
| | 8 | 149.14 tokens/secs | 146.30 tokens/secs | 152.17 tokens/secs |
| | 16 | 282.12 tokens/secs | 264.67 tokens/secs | 289.63 tokens/secs |
| | 32 | 503.03 tokens/secs | 458.25 tokens/secs | 511.78 tokens/secs |
希望在特定领域任务中应用 CodeShell 模型的用户可以参照 CodeShell 提供的 官方微调示例,在 HAI 上进行模型微调。由于博主暂时没有微调的需求,因此这一章节就不展开细说了。
在前文的 3.5 章节,为了测试及演示方便,我们直接将 TGI 服务向公网开放,并通过 HTTP 协议访问 TGI 服务。这个操作会使得 TGI 服务面临一些安全风险,包括但不限于中间人攻击、恶意请求等,因此只适用于短时间的测试及演示场景。生产场景下,建议根据实际情况不同采用不同方案进行安全限制。此处简单列举三个方案以供参考,如果各位小伙伴有更好的方案可以评论区留言交流:
由于 AI 编程助手只会在工作时间使用,因此我们希望在非工作时间关闭 HAI 实例以节约成本,也就是实现 定时开关机功能。但由于 HAI 目前暂未开放 开关机 相关的 API,同时进阶型算力比较紧俏,很容易出现关机后资源售罄无法开机的情况,再加上 HAI 每次开关机都会重新分配公网 IP 等因素,此项优化只能暂时搁置。期待 HAI 后续的迭代更新可以支持自动开关机相关的功能。
虽然定时开关机功能暂时无法实现,但不妨碍我们先为 HAI 加上 开机自动启动TGI服务 功能。
Supervisor 是用 Python 开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台 daemon,并监控进程状态,异常退出时能自动重启。HAI 实例内预置了 Supervisor 来作为 jupyerlab 及其他 webui 的进程守护工具。
/root/text-generation-inference
目录下创建文件 launch_tgi.sh
,复制粘贴以下内容: #!/bin/bash
source $HOME/miniconda3/etc/profile.d/conda.sh
conda activate text-generation-inference
export PATH="$HOME/.cargo/bin:$PATH"
/root/.cargo/bin/text-generation-launcher --model-id /root/CodeShell-7B-Chat --port 3030 --num-shard 1 --max-total-tokens 5000 --max-input-length 4096 --max-stop-sequences 12 --trust-remote-code 2>&1 | tee -a /var/log/tgi_service.log
launch_tgi.sh
赋予执行权限: chmod +x /root/text-generation-inference/launch_tgi.sh
/etc/
目录下的 supervisord.conf
文件,在文件中追加以下内容: [program:text-generation-inference]
command=/root/text-generation-inference/launch_tgi.sh
autostart=true
autorestart=true
numprocs=1
redirect_stderr=true
startretries=10
startsecs=60
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stdout_events_enabled=true
stderr_events_enabled=true
stopasgroup=true
killasgroup=true
/var/log/tgi_service.log
确认是否已经自动启动 TGI 服务 tail -f /var/log/tgi_service.log
在如今整个 AI 浪潮席卷全球,AI 领域发展“日新周异”的背景下,HAI 的推出,打通了 AI 到普通用户的”最后一公里“,大大降低了中小企业和开发者 AI 实践的门槛,为广大用户走进 AIGC、AGI 提供了坚实的基石。在使用HAI的过程中,个人最大的感受就是清爽
,不需要去纠结GPU型号,也不需要再去配置复杂的基础环境,只需要关注应用层即可,大大提高了生产效率。
HAI 这款产品真正做到了如腾讯云品牌视频中描述的那样:科技就像长城上的砖、埃菲尔铁塔上的螺丝,你不必知道他的复杂,你只需要拿来即用,简单易用、即插即用,这才是科技该有的样子。我们将最前沿的科技打磨成简单的样子,用极致算力,集成最优化组合,让需求一目了然、让问题直面解决方案。化繁为简,以小建大。
HAI 在本文发布之时(2023 年 12 月上旬)仍处于内测阶段,结合在部署 CodeShell 大模型过程中遇到的一些问题,在这里也向 HAI 提出一些产品建议:
期待 HAI 能够早日正式发布,引领中小企业和开发者迈向普惠 AI 时代。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。