近日,英伟达RTX 4090显卡在中国区禁售的消息闹得沸沸扬扬。因为在此之前,我不止一次地向朋友们安利过趋动云这家云计算厂商,所以最近有好多朋友来问:
“趋动云靠谱吗?”
“趋动云支持PyTorch吗?兼容性如何?”
“趋动云支持HuggingFace吗?兼容性如何?”
“趋动云跑神经网络网络的速度怎么样?会比nvidia同类显卡慢吗?”
“趋动云跑神经网络网络的性能怎么样?得到的模型准确率会比nvidia同类显卡低吗?”
这次,本文将尽可能详细地回答上述疑惑。
首先,我用趋动云10个月了,并且在硕士研究生阶段和毕业后担任算法工程师期间,实验室和公司的GPU服务器都是由我运维。现在可以负责任地说,趋动云很靠谱。这主要体现在省心、省时、省力。
其次,趋动云依托docker容器化技术,保证了上层应用的一致性和可用性。简单来说,趋动云完美支持PyTorch、Tensorflow、PaddlePaddle等主流深度学习框架;完美兼容HuggingFace的transformers等主流python程序库。从理论上看,趋动云提供的运行环境比我们本地GPU环境还要纯净。
第三,通过实践发现,基于趋动云搭建的PyTorch和huggingface环境在运行效果上,与本地GPU环境没有本质上的差别。具体体现在,运行速度没有太大差别,模型性能(比如P、R、F1)没有太大差别——可以放心使用。举例而言,我使用趋动云复现过ACL 2023的一篇论文,发现实验结果与论文公布结果几乎一致(会有不足1%的差异,但差异较小可以忽略不计)。
下面,以meta-llama/Llama-2-7b-hf为例,手把手带大家在趋动云上走一遍使用流程。总计4步。第1步,创建趋动云账号;第2步,创建趋动云镜像;第3步,创建趋动云项目;第4步,运行代码。
第1步,创建趋动云账号(https://platform.virtaicloud.com/)。
第2步,创建趋动云镜像(在屏幕左边找到“镜像”并点击)
在屏幕右上角,找到“制作镜像”并点击
在屏幕左边找到“添加镜像”并点击
依次点击图中红色箭头指向的按钮,最后选中右侧“PyTorch2.0.1-Conda3.9”镜像,作为基础镜像
编写dockerfile(这里我为大家准备好了一份用于构建llama 2运行环境的dockerfile,拿走不谢)
RUN python3 -m pip install --no-cache-dir \
transformers==4.34.1 \
sentencepiece==0.1.99 \
accelerate==0.23.0 \
sentence-transformers==2.2.2 \
bitsandbytes \
-i https://pypi.virtaicloud.com/repository/pypi/simple
点击右下角的构建
第3步,创建趋动云项目
点击“添加镜像”
在“我的”找到刚才创建好的镜像,并点击右下角的“确认”按钮
点击“添加绑定数据”
在弹出的页面中,首先点击“社区”,然后输入“llama-2-hf”,就只能找到我为大家下载好的llama 2模型checkpoint文件了(目前由7b和13b,后续可能会补充70b)。点击右下角“确认”按钮。
配置好的项目环境如下图所示,确认无误后点击右下角“创建”
在弹出的窗口中点击“暂不上传”
第4步,运行代码。上述步骤执行成功后,会来到如下图所示页面。这里点击“开发”按钮
然后,选择“初始化开发环境实例”
依次选择“B1.medium”作为底层GPU、选择“JupyterLab”作为开发工具,然后点击“确定”
上述步骤执行成功后,会弹出如下图所示提示
等待右侧开发者工具“JupyterLab”被点亮后,点击进入开发环境
成功进入“JupyterLab”,然后点击新建文件
点击新建“notebook”文件
将下列代码填入文本框,然后点击运行按钮
import torch
from transformers import LlamaTokenizer, LlamaForCausalLM
ckpt = '/gemini/data-1/meta-llama_Llama-2-7b-hf'
tokenizer = LlamaTokenizer.from_pretrained(
pretrained_model_name_or_path=ckpt,
)
model = LlamaForCausalLM.from_pretrained(
pretrained_model_name_or_path=ckpt,
torch_dtype=torch.float16,
device_map='auto',
)
prompt = 'Q: What is the largest animal?\nA:'
input_ids = tokenizer(prompt, return_tensors="pt").input_ids.to('cuda')
generation_output = model.generate(
input_ids=input_ids,
max_new_tokens=32
)
print(tokenizer.decode(generation_output[0]))
因为llama-2-7b模型占用15GB磁盘空间,所以这里加载checkpoint文件的时间较长。等待5分钟后,我们如下图所示的得到了正确结果,成功演示!
可以看到,我们问llama-2模型“最大的动物是什么?”
模型回答:“地球上最大的动物是蓝鲸”
模型还自问自答:“最小的动物是什么?”,自答道“最小的动物是侏儒鼩”。
(以上)