试用 Llama-3-8B-Instruct AI 模型

IT 从业人员累的一个原因是要紧跟时代步伐,甚至是被拽着赶,更别说福报 996. 从早先 CGI, ASP, PHP, 到 Java, .Net, Java 开发是 Spring, Hibernate, 而后云时代 AWS, Azure, 程序一路奔波在掌握工具的使用。而如今言必提的 AI 模型更是时髦,n B 参数, 量化, 微调, ML, LLM, NLP, AGI, RAG, Token, LoRA 等一众词更让坠入云里雾里。

去年以机器学习为名买的(游戏机)一直未被正名,机器配置为 CPU i9-13900F + 内存 64G + 显卡 RTX 4090,从进门之后完全处于游戏状态,花了数百小时对《黑神话》进行了几翻测试。

现在要好好用它的 GPU 来体验一下 Meta 开源的 AI 模型,切换到操作系统 Ubuntu 20.04,  用 transformers 的方式试了下两个模型,分别是

  1. Llama-3.1-8B-Instruct: 显存使用了 16G,它的老版本的模型是 Meta-Llama-3-8B-Instruct(支持中文问话,输出是英文)
  2. Llama-3.2-11B-Vision-Instruct: 显存锋值到了 22.6G(可以分析图片的内容)

都是使用的 torch_dtype=torch.bfloat16, 对于 24 G 显存的 4090 还用不着主内存来帮忙。如果用 float32 则需更多的显存,对于 Llama-3.2-11B-Vision-Instruct 使用 float32, 则要求助于主内存,将看到

Some parameters are on the meta device because they were offloaded to the cpu.

反之,对原始模型降低精度,量化成 8 位或 4 位则更节约显卡,这是后话,这里主要记述使用上面的 Llama-3.1-8B-Instruct 模型的过程以及感受它的强大,可比小瞧了这个 8B 的小家伙。所以在手机上可以离线轻松跑一个 1B 的模型。

首先进到 Hugging Face 的 meta-llama/Llama-3.1-8B-Instruct 页面,它提供有 Use with transformers,  Tool use with transoformer, llama3 的使用方式,本文采用第一种方式。

配置 huggingface-cli

运行代码后会去下载该模型件,但我们须事先安装后 huggingface-cli 并配置好 token

然后就可使用 huggingface-cli 命令了,如果不行请把

加到所用 shell 的配置文件中去

执行

到这里 https://huggingface.co/settings/tokens 配置一个 token 并用来 login, 只需做一次即可。

以后用 llama.cpp 或 java-llama.cpp 时可用 huggingface-cli 来下载模型。

申请 Llama-3.1-8B-Instruct 的访问权限

进到页面 Llama-3.1-8B-Instruct,点击 "Expand to review and access" 填入信息申请访问权限,正常情况下几分钟后就会被批准,如果超过十分钟未通过审核就需要好好审核下自己了。

创建 Python 虚拟环境

本机操作系统是 Ubuntu 20.04, Python 版本为 12, Nvidia RTX 显卡 CUDA 版本是  12.2(运行 nvidia-smi 可看到)。 从模型 Llama-3.1-8B-Instruct 的示例代码中可知需要的基本依赖是 torch 和 transformers, 安装支持 GPU 的 torch 组件

在运行后面 test-llama-3-8b.py 脚本时会发现还需要 accelerate 组件,所以上面加上了 accelerate 依赖

ImportError: Using low_cpu_mem_usage=True or a device_map requires Accelerate: pip install 'accelerate>=0.26.0'

验证 pytorch 是否使用 GPU

看到 True 即是,12.4 为当前 torch 支持的 Cuda  版本。

相当于安装 torch 时用的命令

pip 找了一个兼容的 torch 版本

创建 test-llama-3-8b.py

内容来自 Llama-3.1-8B-Instruct 的  Use with transformers 并稍作修改

原代码中 model_id = "meta-llama/Meta-Llama-3.1-8B-Instruct", 有拼写错误,改为 meta-llama/Llama-3.1-8B-Instruct,提示和问题修改了, 调整了 max_new_tokens 和只输出答案的 'content' 部分。

运行 test-llama-3-8b.py

然后就陷入了下载模型的等待时间,下载的快慢就看你的网速或者你的电脑是否与 Hugging Face 之间是否多了堵东西。

我在本机下载过程不到十分钟,下载完即执行,看这次结果

第二次执行 python test-llama-3-8b.py

没有了下载过程, 但每次都有 "Loading checkpoint shards" 过程,生成不同的结果,总的执行时间是 6.7 秒左右

模型文件下载到哪里?

在 ~/.cache/huggingface/hub/*

具体模型文件在各自的 Snapshot 中

下载的文件是在 https://huggingface.co/meta-llama/Llama-3.1-8B-Instruct/tree/main 能看到的不包含 original 目录的文件。.safetensors 是 Hugging Face 推出的模型存储格式。

 

original 目录中是 PyTorch 训练出来的原始文件 .pth 格式。如果用 huggingface-cli download 手动下载的,就要用 --exclude "original/*" 只下载 .safetensors, 或用 --include "original/*" 只下载 original 目录中的原始文件,比如以 llama(llama.cpp 或  java-llama.cpp) 方式使用模型就要 original 文件,然后转换成 GGUF(GPT-Generated Unified Format) 格式.

要相应 GGUF 格式的模型也用不着自己手工转换,在 Hugging Face 上能找到别人转换好的,比如像 bartowski/Llama-3.2-1B-Instruct-GGUF

一个模型动不动十几,几十G, 大参数的模型更不得了,看来有硬盘危机了,又不能用机械硬盘,是时候要加个 4T 的 SSD。

多测试些问题

为避免重复加载模型,我们修改代码,问题可由两种方式输入。

    1. 非交互方式:启动脚本时直接输入,每次加载模型,Python 执行完立即退出,如 python test-llama-3-8b.py "who are you?"
    2. 交互方式:启动脚本时不带参数,只需加载一次模型,进入用户交互模式,直到输入 exit 后才退出程序,python test-llama-3-8b.py

并加上模型加载和推理的执行时间测量代码,有设定了环境变量 PY_DEBUG=true 时会打印出相应的执行时间,方便我们对比不同情形下的性能。

改造后的代码如下

执行

在装载了模型后,测试相同的问题:USA 5 biggest cities and population?

返回结果只需要 2.5 秒,比完全要加载模型来回答问题的 6.7 秒快了许多,节约了加载模型的 4.2 秒的时间。

试试中文, 输入

中文也能理解,还能输出中文,而前一版本的模型 meta-llama/Meta-Llama-3-8B-Instruct 只能理解中文(输入),但不会说与写(输出)

来点技术问题

它能懂多少编程语言?

它的信息够新?

可以问到它的知识更新到什么时候的

Dec 12, 2023

观察 CPU, 内存,GPU 的使用状态

CPU,内存状态监控用 top, GPU 的监控命令是 watch -d -n 0.5 nvidia-smi

比如程序一启动没进到输入提示符时

CPU,内存, GPU 的的运行状态是

 

模型一载入后内存所剩无几,VRAM 快用了 16G, GPU 待机状态

在问 "how to implement a http proxy with node.js and express?" 执行过程中的状态是

从上图看到 GPU 使用达到 98%,功率 291W,连 python 的 CPU 使用也拉满,真的很烧机器。

测试不用 CUDA

使用环境变量将 CUDA 设备隐藏

测试非交互的问话, 即执行

python test-llama-3-8b.py "USA 5 biggest cities and population?"

同时用 nvidia-smi 观察到的 GPU 确实没被使用,全跑在 CPU 上,一直处于极高的使用率 200 多

最后得到答案的总耗时为 8 分 14 秒(即 494 秒), 与使用 GPU 的  6.7 秒,基本是不实用状态。

用交互式的方式,也就是加载完模型,然后输入问题 "USA 5 biggest cities and population?" 测试下。从上一个测试也看出时间基本耗费在推理上,加载模型的时间相比而言可以忽略不记

 测试的结果是加载模型后,从问题话到输出结果的时候是 8 分 3 秒(483 秒),基本上用还是不用 GPU 进行推,问一个简单问题("USA 5 biggest cities and population?" ) 的时间对比是

使用 GPU(CUDA, RTX 4090, 24G, 16384 cuda cores): 2.5 秒
不使用 GPU(完全靠 CPU i9-13900F): 488 秒 -- 8 分 8 秒

这个真有必要突出强调,没有一个好的显卡就玩不了模型,模特还差不多, 而且还没对比更复杂的问题。不用 GPU 试下问题 “how to implement a http proxy with node.js and express?”,花费了 9 分 50 秒(即 590 秒),这些用了 GPU 的话都是几秒内出结果的。再问 "1+1=?" 用了 2 分 40 秒,这智商,用了 GPU 来回答 "1+1=?" 的问题只需 0.5 秒。

Chat Bot UI 想法

既然可以做成命令行下交互式的问题,那很容易实现出一个 WebUI 的聊天窗口。比如用 FastAPI 把前面 transformer pipeline 实现为一个 API, 用户输入内容,调用 pipeline 产生输出,由于代码是用 ` 输出的 Markdown 格式,所以聊天容器内容显示要支持 Markdown。

相关的技术

  1. FastAPI
  2. Vue Bot UI
  3. Vue Simple Chatbot
  4. vue-markdown
  5. Marked

API 方面可以用 llama.cpp 或 java-llama.cpp 来启动 llama server。

 


后记 -- MacBook Pro 下性能测试

通过函数 transformers.pipeline(device=[-1|0]) 可以选择是否使用用 GPU, device=-1 意味不使用 GPU, 全用 CPU,device=0 使用 0 号 GPU 设备。用了 device 参数则不能用  device_map 参数。使用 CUDA 的 GPU 可能过环境变量 export CUDA_VISIBLE_DEVICES= 来禁用 GPU; 而 Mac 下用 Metal Performance Shaders (MPS) 则无法通过环境变量来禁用 GPU, 只能用  device=-1 参数。

顺便测试了一下在 MacBook Pro, CPU: Apple M3 Pro(12 核), 内存 36 G, 内置 18 核的 Metal 3 GPU

  1. 使用 GPU: pipeline(device=0): 加载模型 24 秒,问话 “USA 5 biggest cities and population?” 平均耗时 18 秒
  2. 不使用 GPU: pipeline(device=-1): 加载模型大概 0.8 秒,问话 “USA 5 biggest cities and population?” 平均耗时 23 秒(在获得相同输出的情况下, CPU 推理的结果变化较大)

怎么知道 Mac 是否使用了 GPU 的呢?打开 Activity Monitor / Window / GPU History 可以看到动态。

安装了 PyTorch 后,用如下 Python 脚本可显示 torch 是否支持 MPS

用 M3 Pro 的 CPU(12 核) 还是 GPU(18 核) 结果相差其实不大,用 CPU 时加载模型很快。Mac 下推理要 20 秒左右,相比于 Ubuntu(i9-13900F + 内存 64G + 显卡 RTX 4090) 的加载模型 4.2 秒,推理 2.5 秒还是要慢很多。

本文链接 https://yanbin.blog/get-start-with-llama-3-8b-instruct-ai-model/, 来自 隔叶黄莺 Yanbin Blog

[版权声明] Creative Commons License 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。

Subscribe
Notify of
guest

0 Comments
Inline Feedbacks
View all comments