引入
最近我给家中的拯救者刃9000-ICO机器更换了显卡,将原来的机器自带的RTX 2080更换成了丽台RTX A4000。那么这块A4000的性能究竟如何呢?今天打算用lora训练来验证下。
另外,根据autodl的说明,RTX3090的半精度峰值算力71T,RTX A4000的半精度峰值算力76T,家用A4000实际相比autodl上的3090容器的效果又怎样呢?
方案
这里使用kohya_ss的训练工具进行lora训练作为对比项。选取了完全相同的样本,完全相同的配置。配置batchsize=2, 共1550步。关键配置如下
- 开启xformers
- 开启Adam8bit
- 混合精度选择fp16
- dim为128
对比平台选取了4组,分别是
- autodl云Ubuntu 20.04容器 + RTX 3090
- 家用机Windows 11 + A4000
- 家用机Windows 11 wsl2 + A4000
- 家用机Kubuntu 22.04 + A4000
详情
3090 + Ubuntu 20.04
用时9:32。云平台应该是有非常好的散热措施,340多W的功耗下,显卡温度始终在54度左右。训练期间显卡核心频率在1900MHz左右非常稳定。
1 2 3 4 5 6 7 8 9 10 11 12 |
use 8-bit AdamW optimizer | {} running training / 学習開始 num train images * repeats / 学習画像の数×繰り返し回数: 3100 num reg images / 正則化画像の数: 0 num batches per epoch / 1epochのバッチ数: 1550 num epochs / epoch数: 1 batch size per device / バッチサイズ: 2 gradient accumulation steps / 勾配を合計するステップ数 = 1 total optimization steps / 学習ステップ数: 1550 steps: 0%| | 0/1550 [00:00<?, ?it/s]epoch 1/1 steps: 100%|████████████████████████████████████████████████████████| 1550/1550 [09:31<00:00, 2.71it/s, loss=0.128] |
A4000 + Windows Native
用时12:59。显卡温度在75度左右,使用Afterbunner手动调节风扇转速到69%。训练期间,显卡的核心频率在1450MHz~1860MHz之间来回波动,并随着显卡温度从50度左右上升到75度,会逐步降频,符合预期。
另外Windows方案在开始训练迭代前会额外卡住大概1分钟左右,可以观察到内存在上涨,几乎涨到了64G全部用满。
1 2 3 4 5 6 7 8 9 10 11 12 |
use 8-bit AdamW optimizer | {} running training / 学習開始 num train images * repeats / 学習画像の数×繰り返し回数: 3100 num reg images / 正則化画像の数: 0 num batches per epoch / 1epochのバッチ数: 1550 num epochs / epoch数: 1 batch size per device / バッチサイズ: 2 gradient accumulation steps / 勾配を合計するステップ数 = 1 total optimization steps / 学習ステップ数: 1550 steps: 0%| | 0/1550 [00:00<?, ?it/s]epoch 1/1 steps: 100%|█████████████████████████████████████████████████████████| 1550/1550 [12:59<00:00, 1.99it/s, loss=0.123] |
A4000 + Windows wsl2
用时11:33。显卡温度在75度左右,使用Afterbunner手动调节风扇转速到69%。训练期间,显卡的核心频率在1450MHz~1860MHz之间来回波动,并随着显卡温度从50度左右上升到75度,会逐步降频,符合预期。
wsl2方案在开始训练迭代前会额外卡住大概20s左右,可以观察到内存在上涨,但幅度远小于原生Windows。
1 2 3 4 5 6 7 8 9 10 11 12 |
use 8-bit AdamW optimizer | {} running training / 学習開始 num train images * repeats / 学習画像の数×繰り返し回数: 3100 num reg images / 正則化画像の数: 0 num batches per epoch / 1epochのバッチ数: 1550 num epochs / epoch数: 1 batch size per device / バッチサイズ: 2 gradient accumulation steps / 勾配を合計するステップ数 = 1 total optimization steps / 学習ステップ数: 1550 steps: 0%| | 0/1550 [00:00<?, ?it/s]epoch 1/1 steps: 100%|██████████████████████████████████████████████████████████| 1550/1550 [11:33<00:00, 2.23it/s, loss=0.126] |
A4000 + Kubuntu 22.04
用时10:13。显卡温度在75度左右,使用nvidia-settings手动调节风扇转速到69%。训练期间,显卡的核心频率在1450MHz~1860MHz之间来回波动,并随着显卡温度从50度左右上升到75度,会逐步降频,符合预期。
进入训练迭代前没有卡住的现象
1 2 3 4 5 6 7 8 9 10 11 12 |
use 8-bit AdamW optimizer | {} running training / 学習開始 num train images * repeats / 学習画像の数×繰り返し回数: 3100 num reg images / 正則化画像の数: 0 num batches per epoch / 1epochのバッチ数: 1550 num epochs / epoch数: 1 batch size per device / バッチサイズ: 2 gradient accumulation steps / 勾配を合計するステップ数 = 1 total optimization steps / 学習ステップ数: 1550 steps: 0%| | 0/1550 [00:00<?, ?it/s]epoch 1/1 steps: 100%|██████████████████████████████████████████████████| 1550/1550 [10:13<00:00, 2.53it/s, loss=0.125] |
结论
最终结果如下
- 在fp16 lora训练上,RTX A4000的效能表现约为RTX 3090的93%
- 实测Linux原生平台的性能最好,wsl2次之,windows原生最次
详细数据如下
Plat | CPU | Memory | Driver | Time(in second) | Ratio |
---|---|---|---|---|---|
autodl Linux 3090 | Xeon Platinum 8350C 14C | 32G | 515.57 | 572 | 1 |
home Win A4000 | i9-9900K 8C16T | 64G | 528.49 | 779 | 0.73 |
home WSL2 A4000 | i9-9900K 8C16T | 32G | 528.49 | 693 | 0.83 |
home Linux A4000 | i9-9900K 8C16T | 64G | 525.85 | 613 | 0.93 |
总结
这个结论与预期基本一致。如果在本地使用更强的冷却措施,确保温度一直处于50多度,应当可以达到略强于3090的效果。现状是在较小的机箱中使用改造过的双风扇三热管风冷散热器,温度上升到75度,效能略弱于3090。
另外按照2020年左右的评测,wsl2的Resnet评测的效果是与Windows原生有10%~20%的差距的,目前看综合上数据加载等综合因素,wsl2下的效果比Windows原生是要更好的,所以在Windows平台上使用wsl2是个不错的选择。如果有可能,还是推荐使用原生Linux,这会带来最佳的训练效果。
你好,方便分享一下3090 + Ubuntu 20.04下部署流程吗?我的部署环境Miniconda conda3
Python 3.8(ubuntu20.04),Cuda 11.6
会出现下面错误
Unable to register cuBLAS factory: Attempting to register factory for plugin cuBLAS when one has already been registered
2023-04-07 14:12:37.953800: W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library ‘libnvinfer.so.7’; dlerror: libnvinfer.so.7: cannot open shared object file: No such file or directory; LD_LIBRARY_PATH: /usr/local/nvidia/lib:/usr/local/nvidia/lib64
2023-04-07 14:12:37.953877: W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library ‘libnvinfer_plugin.so.7’; dlerror: libnvinfer_plugin.so.7: cannot open shared object file: No such file or directory; LD_LIBRARY_PATH: /usr/local/nvidia/lib:/usr/local/nvidia/lib64
你报告的这两个并不是错误,而是tensorflow的Warning,不影响实际运行的。项目中对tensorflow的使用仅限于tensorboard,即记录日志。如果你不想看到这些,可以尝试手工降级安装tensorflow到2.9.3版本,就不会报告上面的问题了。
pip install tensorflow==2.9.3