这里写自定义目录标题
硬件 部署模型 硬件性能监控工具 GPU监控工具 CPU和系统内存监控工具 部署框架 命令 测试脚本与结果 输出定量token测试 prompt 脚本 Test Result 输入定量token测试 prompt 脚本 Test Result 性能分析 系统内存和GPU内存占用变化分析 系统内存和GPU内存占用变化 系统内存总结 GPU内存总结 系统CPU占用分析 GPU分析 其他分析总结 其他考虑因素 Context window本文主要是个人学习记录,请见谅不够详细和错字
硬件
1张Nvidia A100 80G
部署模型
Lamma3.1 70b 4bit
4bit是指quantization,4bit是最小的(代表精度最低(模型大小最小),但性能最好,ollama只支持4bit)。我在ollama官网没看到是用的那个版本的4bit,llama官网也没看见不同quantization版本,所以我不确定Llama官方是否提供了不同quantization版本(知道的麻烦告知下)
硬件性能监控工具
GPU监控工具
开源可视化工具nvitop安装命令:pip install nvitop
运行命令:nvitop
* Nvidia自带监控
watch -n 1 nvidia-smi
CPU和系统内存监控工具
Linux的top命令(top后再按1,可以查看多核cpu每个核心的占用)
部署框架
https://github.com/ollama/ollama
命令
ollama pull llama3.1:70b
ollama run llama3.1:70b
测试脚本与结果
本次测试的最重要的结果是平均每个线程的每秒token生成数(生成的总token数 / 响应总时间),因为chatgpt是流式生成token(感兴趣的可以看ChatGPT流式显示单词的技术实现 )的, 所以 tokens/second是直接影响用户体验的数据,衡量了llm的文字生成速度(一个token约等于一个文字)
输出定量token测试
prompt
tell a story in " + str(world_count) + " words:
脚本
https://github.com/codeHui/ai_script/blob/main/A100_80G_Llama3_70B/70b_output-stream.py
Test Result
Number of Requests Output Word Count Average Tokens Average Time (s) Average Speed (tokens/s) 1 25 28 1.22156 22.9214 1 50 63 2.49925 25.2076 1 100 119 4.68078 25.4231 1 400 456 18.0439 25.2717 1 800 821 32.9355 24.9275 2 25 31 1.4789 20.9615 2 50 60.5 2.84061 21.2983 2 100 125 5.59961 22.323 2 400 460.5 21.3357 21.5835 2 800 877 42.0024 20.8798 4 25 30.5 2.0107 15.1689 4 50 66.5 4.21136 15.7906 4 100 122.75 7.56207 16.232 4 400 478.25 31.1035 15.3761 4 800 1066.75 76.1915 14.0009输入定量token测试
prompt
"give a title for below text in 10 words: " + text
(text has 484 words)
脚本
https://github.com/codeHui/ai_script/blob/main/A100_80G_Llama3_70B/70b_input-stream.py
Test Result
Number of Requests Output Word Count Average Tokens Average Time (s) Average Speed (tokens/s) 1 10 16 2.27796 7.02383 2 10 19 2.63539 7.20955 4 10 16.75 4.58825 3.65063性能分析
系统内存和GPU内存占用变化分析
系统内存和GPU内存占用变化
系统内存总结
如果部署40G的llm, 系统内存大于40G肯定行(小于不确定,没测过),系统会先将llm加载到系统内存中(比较慢,感觉1秒1G的速度),然后瞬间将40G的llm加载到GPU的内存。
之后并发请求测试也基本完全不会用到系统内存。
if the system memory is very big (220G, much bigger than the Llama3.1 70b(40G))
when execute ollama pull, the system memory will cache the llm file(40G)
when execute ollama run, the system memory will cache the llm file(40G) if not cached yet, once done, the llm file will be copied to GPU memory(VRAM) immediately
once the llm is running, there is no need for system memory to cache LLM
GPU内存总结
在并发测试中,GPU内存一直保持42G,并无增加,所以GPU内存大于LLM应该就行 同时我测了如果用
如果有两个A100 80G的话,ollama 也只会使用一个GPU(这里不多讨论多GPU的方案,也有很多细节)
系统CPU占用分析
我测试了,不管单个还是并发访问下,也只有一个CPU core接近满载80~100%运行(不确定为什么只会利用一个core的CPU,以及CPU在做什么计算工作?有知道的话麻烦评论告知我,谢谢)
由于只占用一个core,所以cpu肯定不是瓶颈
GPU分析
问llm问题时,GPU基本满载,可以确定GPU决定了响应速度 Llama最多会并发处理4个请求,超过的会先放到队列里,所以该设计能防止out of memory(把脚本改成8个并发,从响应时间可以看出超过4个的会放到队列里)其他分析总结
由上面两个测试可以看出,虽然input和output都占用总token,但output的生成更慢 (所以可以解释到GPT-4o 的收费,也是output tokens比input tokens 贵)其他考虑因素
Context window
Llama3.1的context window是128k, 但我测试了“让llm生成3000字的故事”,实际只会返回1000多字的答案,所以某个地方应该有设置限制了响应的token数(我没深入查,如果有知道是哪里限制的(比如chat API的哪个字段),请告知下)。
所以我上面只测试了1000以下的token数(一般用户场景足够),但如果真的是用满了128k的context window,是否系统内存和gpu内存会有比较明显的提升,我也不敢确定(因为没测过,有测过的也可以share下)
总结
本篇文章是个人在学习和部署LLaMA(Lamda)模型过程中的记录和性能分析报告。主要内容涵盖了所使用的硬件配置、模型部署、性能监控工具、部署命令、测试脚本及方法、以及详细的性能测试结果与性能分析。以下是文章的总结:### 1. 硬件概述
- **GPU**: 使用了1张Nvidia A100 80G显卡。
- **模型**: 部署了LLaMA 3.1 70B版本的4bit量化模型,该模型在精度和性能之间做出了良好的平衡。
### 2. 部署及监控工具
- **部署框架**: 使用ollama框架来部署和运行LLaMA模型。
- **硬件监控**:
- **GPU**: 使用了开源工具nvitop和Nvidia自带的nvidia-smi工具进行监控。
- **CPU和系统内存**: 利用Linux的top命令进行监控。
### 3. 测试及结果
- **测试脚本**: 编写了输出定量token和输入定量token两个测试脚本,用于评估模型的性能。
- **性能指标**: 通过计算平均每秒生成的token数量(tokens/s)来衡量模型的语言生成速度。
- **测试结果**:
- 在**输出定量token测试**中,随着生成字数的增加,平均生成速度稳定在约25 tokens/s左右,但多并发时速度有所下降。
- 在**输入定量token测试**中,由于输入规模较小,平均生成速度较低,约为7 tokens/s。
### 4. 性能分析
- **内存分析**:
- **系统内存**: 系统内存主要用于缓存LLaMA模型文件,加载完成后由GPU接管,对于更大的系统内存主要是为了加速模型文件的加载。
- **GPU内存**: 并发测试中GPU内存保持稳定,未超出模型需求,显示GPU内存充足时,LLaMA能够稳定运行。
- **CPU分析**: 仅有一个CPU核接近满载,说明CPU不是瓶颈,模型更多依赖GPU进行处理。
- **GPU分析**: GPU基本保持满载,是影响响应速度的关键因素。LLaMA能够并发处理最多4个请求,超出部分将排队等待。
### 5. 其他考虑因素
- **Context window**: LLaMA的context window限制可能导致实际生成的响应字数少于请求,实际测试中以适合常规用户场景的长度进行验证。
- **物理硬件限制**: 即便在多GPU环境下,ollama框架默认只使用一个GPU,需进一步配置以实现多GPU使用。
### 6. 总结与展望
- 本文详细记录了部署LLaMA模型的过程,并通过多次测试评估了其在不同场景下的性能表现。
- 结果表明,硬件资源(尤其是GPU)是影响模型速度和响应能力的重要因素,CPU在多线程处理上显得相对沉寂。
- 进一步研究可以包括优化多GPU部署策略、调整模型量化级别以提升性能和精度,以及探讨context window的限制和优化策略。