English Русский Español Deutsch 日本語 Português
preview
将您自己的 LLM 集成到 EA 中(第 4 部分):使用 GPU 训练自己的 LLM

将您自己的 LLM 集成到 EA 中(第 4 部分):使用 GPU 训练自己的 LLM

MetaTrader 5交易 | 14 四月 2025, 08:37
514 1
Yuqiang Pan
Yuqiang Pan

目录:



概述

在上一篇文章中,我们简要讨论了如何为大型语言模型创建数据集,并通过一个简单的示例演示了如何仅使用 CPU 训练语言模型。然而,我们没有测试该模型,因为实际上,它只是一个预训练的模型。在本文中,我们继续讨论模型训练,这次使用 GPU 来加速这一过程。值得注意的是,作为一个演示示例,这个模型仍然不够强大,因此我们在本文中不会介绍模型测试。测试将在后续文章中讨论。  

我们之前在本系列的第二部分介绍了 CUDA 加速环境的设置。现在,我们将重点介绍使用 AMD 显卡来加速训练,这是对上一篇文章的补充。目前,设置 NVIDIA 显卡环境相对简单,而为 AMD 显卡配置环境可能会带来各种挑战。在本文中,我们将提供常见问题的解决方案,使您能够使用 AMD 显卡顺利加速自己的金融语言模型的培训。如果您使用的是 NVIDIA 显卡,请不要担心 — 训练方法是相同的。只要您已经设置好 CUDA 环境,您就可以按照本文提供的训练说明进行操作,而无需关注 AMD 卡的具体配置步骤。  

你准备好了吗? 


准备工作

在本系列的前一篇文章中,我们介绍了 NVIDIA 环境的设置。然而,我们不应该忽视这样一个事实,即一些用户正在使用 AMD 硬件。因此,我们还将讨论如何设置 ROCm(Radeon Open Compute)加速计算环境。截至目前,Windows 上还没有支持 ROCm 的 PyTorch 版本,WSL(适用于 Linux 的 Windows 子系统)也不支持 ROCm。因此,如果您想使用 ROCm 训练大型模型,Linux(特别是 Ubuntu)目前是可行的选择(从积极的一面来看,下一个版本的 ROCm 可能会在未来添加 WSL 支持,但目前的最新版本是 6.1.2,我不认为第一个支持的版本是最佳的。)。在使用过程中,我遇到了几个与 AMD 硬件相关的问题,这些问题是我在 NVIDIA 上没有遇到的。我将分享一些我认为对 AMD 用户有帮助的解决方案。虽然这可能有点麻烦,但请记住我们是在省钱,对吧?啊哈…  

所以,如果你想使用 AMD 显卡加速大型语言模型的训练,以下是必要的准备:     

1.安装 Ubuntu  

你需要安装一个 Ubuntu 系统。在同一台 PC 上设置 Windows 和 Ubuntu 的双引导系统是可行的,也是推荐的。我们可能需要从 Windows 系统访问数据,因此同时拥有这两个操作系统选项很有用。网上有很多关于设置双启动系统的详细教程。或者,您可以将 AMD 设备部署为远程 Ubuntu 主机,并将其用作远程开发环境。然后,您可以从 Windows 系统通过 SSH 连接到远程主机。这种方法类似于在 Windows 上使用 WSL,关键区别在于 AMD 显卡不支持 WSL。我已经向 ROCm 开发人员询问了这一点,他们提到 WSL 支持目前正在开发中(可能在下一个版本中可用)。但是,请记住,此解决方案可能需要您拥有多台计算机。就我个人而言,我正在使用这种方法。  

2.检查硬件配置  

请谨慎对待您的硬件配置。例如,我的 7900XTX 显卡经常遇到驱动程序崩溃。最初,我使用了 850W 的电源,这应该足以满足单个 GPU 的需求。不过,我没有考虑到驱动程序崩溃可能与电源问题有关。在尝试了各种解决办法均无成功后,一位朋友建议升级到 1250W 电源,一切都顺利进行。

因此,以下是向所有 AMD 硬件用户提出的真诚建议:确保您的电源可以支持您的设备。  

3.ROCM 和 HIP   

如果您更喜欢不太复杂的环境设置,则可以使用 AMD 的官方 Docker 镜像。只需使用 Docker 拉取 ROCm 官方容器镜像即可。大多数必要的环境配置已经在 Docker 镜像中设置好了,这就是我推荐这种方法的原因。

4.硬件设置

在我的设备使用过程中,我注意到 Ubuntu 下 AMDGPU 驱动程序的优化不太好。以我的 7900XTX 为例:虽然它可以输出 350W 的功率,但默认限制设置为 303W。另外,即使在满负荷下,风扇转速也低于45%,核心温度保持在 100°C。对于真正的大型模型训练,可能会连续运行几个小时甚至几天,保持如此高的温度对设备来说是有风险的。  

现在想换硬件设备吗?相信我,还有更多…  


硬件配置

1.驱动程序设置

到目前为止,Ubuntu 中的 amdgpu 驱动提供了一些用于 GPU 设置的外部接口。配置文件位于 “/sys/class/drm/card0/device/hwmon/hwmon2/”。请注意,“hwmon2” 可能会有变化;它可能是 “hwmon1” 或其他值。请根据您的具体设备进行调整。我建议适当调整风扇速度和功率,但避免修改其他设置。  

让我们说明如何设置风扇速度。这些文件操作需要管理员权限,否则您将无法进行更改。我建议使用 root 用户进行修改:    

  • 首先,启用 pwm1:echo "1" > /sys/class/drm/card0/device/hwmon/hwmon2/pwm1_enable
  • 应用设置:echo "c" > /sys/class/drm/card0/device/hwmon/hwmon2/pwm1_enable

将风扇转速设置为 128。该值的范围是 0 到 255,其中 255 对应最大风扇转速。

  • 根据您的需要进行调整:echo "128" > /sys/class/drm/card0/device/hwmon/hwmon2/pwm1
  • 应用设置:echo "c" > /sys/class/drm/card0/device/hwmon/hwmon2/pwm1     

调整功率限制。例如,如果你的 7900XTX 最大功率为 350W,默认为 303W:

  • 修改为 330W:echo "330000000" > /sys/class/drm/card0/device/hwmon/hwmon2/power1_cap
  • 应用设置:echo "c" > /sys/class/drm/card0/device/hwmon/hwmon2/power1_cap   

请注意:   

1.要恢复设置,请使用 echo "r" > 后跟相关路径(例如,echo "r" > /sys/class/drm/card0/device/hwmon/hwmon2/pwm1_enable)。  

2.避免通过“pwm1”和“fan[1-*]_target”接口同时设置风扇速度,因为后者将覆盖前者。     

2.ROCM-SMI 设置

以下是 rocm-smi 常用的命令: 

用法:rocm-smi [-h] [-V] [-d DEVICE [DEVICE ...]] [--alldevices] [--showhw] [-a] [-i] [-v] [-e [EVENT ...]]
                [--showdriverversion] [--showtempgraph] [--showfwinfo [BLOCK ...]] [--showmclkrange] [--showmemvendor]
                [--showsclkrange] [--showproductname] [--showserial] [--showuniqueid] [--showVoltagerange] [--showbus]
                [--showpagesinfo] [--showpendingpages] [--showretiredpages] [--showunreservablepages] [-f] [-P] [-t]
                [-u] [--showmemuse] [--showvoltage] [-b] [-c] [-g] [-l] [-M] [-m] [-o] [-p] [-S] [-s]
                [--showmeminfo TYPE [TYPE ...]] [--showpids [VERBOSE]] [--showpidgpus [SHOWPIDGPUS ...]]
                [--showreplaycount] [--showrasinfo [SHOWRASINFO ...]] [--showvc] [--showxgmierr] [--showtopo]
                [--showtopoaccess] [--showtopoweight] [--showtopohops] [--showtopotype] [--showtoponuma]
                [--showenergycounter] [--shownodesbw] [--showcomputepartition] [--showmemorypartition] [-r]
                [--resetfans] [--resetprofile] [--resetpoweroverdrive] [--resetxgmierr] [--resetperfdeterminism]
                [--resetcomputepartition] [--resetmemorypartition] [--setclock TYPE LEVEL] [--setsclk LEVEL [LEVEL ...]]
                [--setmclk LEVEL [LEVEL ...]] [--setpcie LEVEL [LEVEL ...]] [--setslevel SCLKLEVEL SCLK SVOLT]
                [--setmlevel MCLKLEVEL MCLK MVOLT] [--setvc POINT SCLK SVOLT] [--setsrange SCLKMIN SCLKMAX]
                [--setextremum min|max sclk|mclk CLK] [--setmrange MCLKMIN MCLKMAX] [--setfan LEVEL]
                [--setperflevel LEVEL] [--setoverdrive %] [--setmemoverdrive %] [--setpoweroverdrive WATTS]
                [--setprofile SETPROFILE] [--setperfdeterminism SCLK]
                [--setcomputepartition {CPX,SPX,DPX,TPX,QPX,cpx,spx,dpx,tpx,qpx}]
                [--setmemorypartition {NPS1,NPS2,NPS4,NPS8,nps1,nps2,nps4,nps8}] [--rasenable BLOCK ERRTYPE]
                [--rasdisable BLOCK ERRTYPE] [--rasinject BLOCK] [--gpureset] [--load FILE | --save FILE]
                [--autorespond RESPONSE] [--loglevel LEVEL] [--json] [--csv]

设置选项:
  --setclock TYPE LEVEL                            设置指定时钟的时钟频率级别(需要手动性能级别)
  --setsclk LEVEL [LEVEL ...]                      设置 GPU 时钟频率级别(需要手动性能级别)
  --setmclk LEVEL [LEVEL ...]                     设置 GPU 内存时钟频率级别(需要手动性能级别)
  --setpcie LEVEL [LEVEL ...]                      设置 PCIE 时钟频率级别(需要手动设置性能级别)
  --setslevel SCLKLEVEL SCLK SVOLT      更改特定级别的 GPU 时钟频率 (MHz) 和电压 (mV)
  --setmlevel MCLKLEVEL MCLK MVOLT  将 GPU 内存时钟频率(MHz)和电压(mV)更改为特定级别
  --setvc POINT SCLK SVOLT                     更改特定点的 SCLK 电压曲线(MHz mV)
  --setsrange SCLKMIN SCLKMAX            设置最小和最大 SCLK 速度
  --setextremum min|max sclk|mclk CLK  设置 SCLK/MCLK 速度的最小值/最大值
  --setmrange MCLKMIN MCLKMAX         设置最小和最大 MCLK 速度
  --setfan LEVEL                                          设置 GPU 风扇速度(级别或%)
  --setperflevel LEVEL                                设置性能级别
  --setoverdrive %                                       设置 GPU OverDrive 级别(需要手动|高性能级别)
  --setmemoverdrive %                               设置 GPU 内存超频 OverDrive 级别(需要手动|高性能级别)
  --setpoweroverdrive WATTS                    使用 Power OverDrive 设置最大 GPU 功率(以瓦为单位)
  --setprofile SETPROFILE                          指定电源配置文件级别 (#) 或自定义配置文件属性的引号字符串“# # # #...”(需要手动性能级别)

  --setperfdeterminism SCLK                     设置时钟频率限制以获得最小的性能变化

  --setcomputepartition {CPX,SPX,DPX,TPX,QPX,cpx,spx,dpx,tpx,qpx}                            设置计算分区
  --setmemorypartition {NPS1,NPS2,NPS4,NPS8,nps1,nps2,nps4,nps8}                          设置内存分区
  --rasenable BLOCK ERRTYPE                  为指定块和错误类型启用 RAS
  --rasdisable BLOCK ERRTYPE                 禁用指定块和错误类型的 RAS
  --rasinject BLOCK                                    为指定块注入 RAS 错误(仅适用于不安全的主板)

重置选项:
  -r, --resetclocks                                       将时钟和 OverDrive 重置为默认值
  --resetfans                                               将风扇重置为自动(驱动器)控制
  --resetprofile                                           将电源配置文件重置为默认值
  --resetpoweroverdrive                            将最大 GPU 功率设置回设备默认状态
  --resetxgmierr                                         重置 XGMI 错误计数
  --resetperfdeterminism                          禁用性能确定性
  --resetcomputepartition                         重置为启动计算分区状态
  --resetmemorypartition                          重置为启动内存分区状态

自动响应选项:
  --autorespond RESPONSE                     自动响应所有提示(不推荐)

输出选项:
  --loglevel LEVEL                                     程序执行时将打印多少输出,可以是 debug/info/warning/error/critical 之一
  --json                                                      以 JSON 格式打印输出
  --csv                                                       以 CSV 格式打印输出

         

3.AMD-SMI 设置

根据 ROCm 目前的发展方向,amd-smi 有可能取代 rocm-smi。以下是 amd-smi 常用的命令: 

用法:amd-smi set [-h] -g GPU [GPU ...] [-f %] [-l LEVEL] [-P SETPROFILE] [-d SCLKMAX]
                   [-C PARTITION] [-M PARTITION] [-o WATTS] [-p POLICY_ID] [-x POLICY_ID]
                   [--json | --csv] [--file FILE] [--loglevel LEVEL]

必须指定 GPU 才能设置配置。                                    
必须提供一个设置参数;可以接受多个设置参数

设置参数:
  -h, --help                                                       显示此帮助消息并退出
  -g, --gpu GPU [GPU ...]                                从可能的选项中选择一个 GPU ID、BDF 或 UUID
  -f, --fan %                                                      设置 GPU 风扇速度(0-255 或 0-100%)
  -l, --perf-level LEVEL                                   设置性能级别
  -P, --profile SETPROFILE                             设置功率配置文件级别 (#) 或自定义配置文件属性的引号字符串
  -d, --perf-determinism SCLKMAX              将 GPU 时钟频率限制和性能级别设置为确定性,以获得最小的性能变化
  -C, --compute-partition PARTITION           设置以下计算分区模式之一: CPX、SPX、DPX、TPX、QPX
  -M, --memory-partition PARTITION            设置以下内存分区模式之一:NPS1、NPS2、NPS4、NPS8
  -o, --power-cap WATTS                               设置电源容量限制
  -p, --dpm-policy POLICY_ID                        使用策略 ID 设置 GPU DPM 策略
  -x, --xgmi-plpd POLICY_ID                          使用策略 ID 设置 GPU XGMI 每链路断电策略

命令修饰符:
  --json                        以 JSON 格式显示输出(默认情况下人类可读)。
  --csv                         以 CSV 格式显示输出(默认情况下为人类可读)。
  --file FILE                  将输出保存到提供的路径上的文件中(默认为 stdout)。
  --loglevel LEVEL      从可能的选项中设置日志记录级别: DEBUG, INFO, WARNING, ERROR, CRITICAL

  

请注意:  

值得一提的是,使用 amd-smi 时某些设置会失败,但使用 rocm-smi 时可以成功。例如:sudo amd-smi set -g 0 -f 90% 失败:"ValueError:Unable to set fan speed 229 on GPU ID:0 BDF:0000:03:00.0”。在这种情况下,切换到使用 rocm-smi:sudo rocm-smi --setfan 90%,成功了!


4.支持硬件设置的软件

在 Ubuntu 中,也有基于 UI 的管理工具可用。虽然我们不会在本文中详细探讨它们,但感兴趣的用户可以探索以下选项:  

LACT: https://github.com/ilya-zlobintsev/LACT

radeon-profile:https://github.com/marazmista/radeon-profile


开发环境

设置好硬件后,您需要在系统上配置以下环境以实现 GPU 加速。让我们继续以 AMD 设备为例:

  • 加速计算的驱动程序支持:我们需要安装 amdgpu DKMS 驱动程序和 ROCm HIP SDK。
  • 对于支持加速计算的 Python 库:PyTorch 使用 ROCm 编译。如果你需要对模型进行量化,可以考虑使用 bitsandbytes(用 ROCm 编译)。为了加速计算,您可能需要 flash-attention 和 triton(均使用 ROCm 编译)。在推理测试期间,您可以使用 vllm。在我们的示例中,安装 PyTorch 就足够了。

1.驱动程序和依赖项安装

检查您的硬件和系统是否支持最新的 ROCm 版本。如果没有,请探索早期的 ROCm 版本。如果没有版本支持你的设备,恭喜你 — 你终于摆脱了AMD的折磨!考虑探索其他品牌。如果您的设备支持 ROCm,您有两个选择:使用 Docker 直接在本地主机上安装部署环境。无论您是在本地安装还是在 Docker 容器内安装,步骤都是类似的。然而,我强烈推荐使用 Docker。如果你在操作过程中犯了错误,你可以简单地删除容器,并从已经拉取的 Ubuntu 映像中运行一个新的容器 — 不需要重新安装系统!因此,本文重点介绍使用 Docker 部署开发环境。安装 Docker 时,请使用 Docker Engine(而不是 Docker Desktop)。参考安装指南: https://docs.docker.com/engine/install


2.拉取基础镜像

拉取 Ubuntu 22.04 基础镜像:docker pull ubuntu:22.04  

请注意:

如果你喜欢非定制部署,直接拉取 ROCm/PyTorch 镜像:docker pull ROCm/PyTorch:latest。

然后运行容器:

docker run -it --cap-add=SYS_PTRACE --security-opt seccomp=unconfined \
		--device=/dev/kfd --device=/dev/dri --group-add video \
		--ipc=host --network=host --shm-size 8G rocm/pytorch:latest

在 Docker 容器内部,大多数开发环境已经配置完毕。您可以将 llm.c 复制到容器中,也可以使用 Git 从官方存储库克隆它。然后直接进入模型训练部分。但是,如果您遇到不常见的问题,您将不知道如何进行故障排除。因此,我的建议是逐步部署,这样你就永远知道在哪里可以找到解决方案。

3.创建容器

运行以下命令创建容器(如果需要,可以选择其他名称):

docker run -it --name llmc --cap-add=SYS_PTRACE --ipc=host --network=host \
		--security-opt seccomp=unconfined --device=/dev/kfd --device=/dev/dri --group-add video ubuntu:22.04  

请注意:

“--name llmc”是可选的,它将创建的容器命名为 “llmc”。如果省略此参数,容器将有一个随机名称。   我建议使用 --network=host 来简化从容器到主机的网络访问。否则,默认网络模式将被桥接,这会使容器到主机的网络访问(例如,访问主机的网络代理)变得复杂。“--ipc=host” 允许容器与主机共享内存,提高效率。但它降低了安全性。请根据您的需要使用它。 


4.驱动程序安装和 ROCm 设置    

安装必要的软件依赖项。如果您在主机上安装,请在命令前加上 sudo:

apt install wget

apt install gpg

配置 amdgpu APT 存储库:

wget https://repo.radeon.com/rocm/rocm.gpg.key -O - | gpg --dearmor | tee /etc/apt/keyrings/rocm.gpg > /dev/null  

echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/rocm.gpg] https://repo.radeon.com/amdgpu/6.1.1/ubuntu jammy main" \    | tee /etc/apt/sources.list.d/amdgpu.list  

apt update  

echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/rocm.gpg] https://repo.radeon.com/rocm/apt/6.1.1 jammy main" \    | tee --append /etc/apt/sources.list.d/rocm.list  

echo -e 'Package: *\nPin: release o=repo.radeon.com\nPin-Priority: 600' \    | tee /etc/apt/preferences.d/rocm-pin-600  

apt update  

安装 amdgpu 驱动程序: 

apt install amdgpu-dkms

如果您在本地主机上安装,请重新启动系统:reboot。

安装 ROCm(我选择了 rocm-hip-sdk):  

apt install rocm-hip-sdk

当然,你也有其他选择:  

  • rocm:所有 ROCm 核心包、工具和库。
  • rocm-language-runtime:ROCm 运行库。
  • rocm-developer-tools:调试和分析 HIP 应用程序。
  • rocm-hip-runtime:运行为 AMD 平台编写的 HIP 应用程序。
  • rocm-hip-runtime-devel:在 HIP 上开发应用程序或者从 CUDA 移植。
  • rocm-opencl-runtime:在 AMD 平台上运行基于 OpenCL 的应用程序。
  • rocm-opencl-sdk:为 AMD 平台开发基于 OpenCL 的应用程序。
  • rocm-hip-libraries:针对 AMD 平台优化的 HIP 库。
  • rocm-hip-sdk:为 AMD 平台开发或移植 HIP 应用程序和库。
  • rocm-ml-libraries:关键的机器学习库。包括 MIOpen。
  • rocm-ml-sdk:为 AMD 开发和运行机器学习应用程序。
  • rocm-openmp-runtime:在 AMD 平台上运行基于 OpenMP 的应用程序。
  • rocm-openmp-sdk:为 AMD 软件开发基于 OpenMP 的应用程序。

安装完成后,添加以下环境变量:  

tee --append /etc/ld.so.conf.d/rocm.conf <<EOF

/opt/rocm/lib/opt/rocm/lib64EOF  

ldconfig

检查 DKMS 状态:

dkms status

将二进制文件路径添加到 PATH 环境变量:

export PATH=$PATH:/opt/rocm-6.1.1/bin

验证安装:/opt/rocm-6.1.1/bin/rocminfo /opt/rocm-6.1.1/bin/clinfo  

5.安装 PyTorch

如果未安装 Python,请使用 apt 安装,或者设置 Conda (Miniconda) 环境:apt install libjpeg-dev python3-dev python3-pip  

接下来,检查 PyTorch 官方网站,看看你的 ROCm 版本是否受支持。截至目前,正式版本还不支持 ROCm 6.1.1,因此我们将安装预览版本:  

pip3 install --pre torch torchvision torchaudio --index-url https://download.pytorch.org/whl/nightly/rocm6.1/ 

torch

如果您的 ROCm 版本低于官方支持的版本,请相应地调整安装命令。例如,如果官方发布命令为:pip3 install torch --index-url https://download.pytorch.org/whl/rocm6.0,而你的 ROCm 版本为“5.7.*”,则可以按如下方式安装:  

pip3 install torch --index-url https://download.pytorch.org/whl/rocm5.7


如果您遇到“NameError: name ‘amdsmi’ is not defined” 的问题,这是因为较新的 Torch 版本需要 Python 支持 amdsmi。不幸的是,直接使用 pip 是行不通的。您需要在本地构建并安装它。导航到 /opt/rocm/share/amd_smi 并安装 amd-smi-lib:  

apt install amd-smi-lib  

如果要安装主机的默认 Python 版本:  

python3 -m pip install --user . 

如果您遇到如下权限错误:  

error: Cannot update time stamp of directory 'amdsmi.egg-info'  

error: could not create 'amdsmi.egg-info': Permission denied  

使用 root 权限运行以下命令:  

sudo python3 -m pip install --user .  

如果找不到 Python3,请使用:  

sudo -H python3 -m pip install --user .  

如果您使用 Conda 环境(例如名为“train_llm”),请按如下方式安装:  

sudo /home/deeper/miniconda/envs/train_llm/bin/python -m pip install . 

将该路径替换为特定虚拟环境的 Python 路径。

最后,重试:  

pip3 install --pre torch torchvision torchaudio --index-url https://download.pytorch.org/whl/nightly/rocm6.1/

  

训练模型

与上一篇文章类似,我们将继续使用开源项目 “llm.c”。就我个人而言,我觉得这个项目很棒 — 代码逻辑清晰,注释详细,易于阅读。有兴趣的读者可以探索这个项目的整个源代码,以清楚地了解训练大型语言模型的整个过程。我不会在这里重复每个训练步骤的代码,源代码中的注释已经非常明确了。  

下载 “llm.c” 仓库,这里要注意,不要直接 git 官方仓库,而是使用支持 AMD 设备的 “ https://github.com/anthonix/llm.c ” 项目。如果训练时遇到问题,可以切换到我使用的源代码版本,目前我使用的版本是 “37dfcf6”:

cd llm.c
git checkout 37dfcf6

如果需要切换版本,可以在 git clone 下项目后使用如下命令行进行切换:

1.安装项目依赖项

首先,安装项目依赖项:  

pip install -r requirements.txt 

请注意,您应该先安装 Torch,然后再从 requirements.txt 安装依赖项,以避免版本冲突。

接下来编译项目:  

make train_gpt2amd AMDGPU_TARGETS=gfx1100 

要确定您的特定 ISA(指令集架构),请使用 rocminfo 并使用 grep 过滤输出:  

rocminfo | grep Name:  

2.准备训练

这一步和在 CPU 上训练类似,这里就不细说了。如果需要更全面的解释,可以参考前一篇文章。以下是训练命令。

获取数据:

python data_enc

训练准备:

python train_gpt2.py --input_bin data/val_data.bin

 将 “data/val_data.bin” 替换为运行 data_enc 的输出路径。   

执行以下命令: 

make train_gpt2amd AMDGPU_TARGETS=gfx1100  

再次,将 gfx1100 替换为从 rocminfo 获得的特定 ISA。   

请注意:  

如果遇到 “fatal error: ‘cmath’ file not found”,则很可能是由于 g++ 版本不匹配。一些 Ubuntu 版本附带 g++11,但没有附带 g++12。安装 g++12 并设置为默认版本: 

apt install g++-12  

update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-12 60 --slave /usr/bin/g++ g++ /usr/bin/g++-12 
忽略 “4 warnings generated when compiling for host.”,执行以下命令:  
./train_gpt2amd  

当我运行最后一个命令时,我收到一个程序崩溃,显示 “[CUDA ERROR] at file build/hip/llmc/layernorm.cuh:400”。如果您此时后悔选择 AMD 硬件,请相信我,这只是一个开始 — 还有更多的挑战在等待着您。AMD 硬件的旅程才刚刚开始!  

如果您成功执行,那就太好了!如果没有,不要灰心,我们仍然可以使用 Python 脚本来训练模型。   

使用 Python 脚本训练模型,可以运行以下命令:  

python train_gpt2.py \
    --input_bin "./data/train_data.bin" \
    --input_val_bin "./data/val_data.bin" \
    --val_loss_every 10 \
    --sample_every 0 \
    --output_dir pylog124M \
    --write_tensors 0 \
    --model d12 \
    --batch_size 16 \
    --sequence_length 128 \
    --total_batch_size 4096 \
    --dtype bfloat16 \
    --compile 1 \
    --tensorcores 1 \
    --flash 1 \
    --num_iterations 100 \
    --weight_decay 0.1 \
    --zero_stage 1 \
    --learning_rate 0.0006 \
    --warmup_iters 0 \
    --learning_rate_decay_frac 0.0 \
    --overfit_single_batch 0

这里有几个需要提一下的参数:  

  • –input_bin "./data/train_data.bin" 这是我们的训练数据集;
  • –input_val_bin "./data/val_data.bin" 这是我们的验证数据集;
  • –val_loss_every 10 每隔一定步数打印一次损失;
  • –batch_size 16 这个值必须是 2 的幂否则会出错,因为我们只是测试,数据集不大,所以没有必要太大;
  • –sequence_length 128 这个值必须是 2 的幂否则会出错,因为我们的数据集的序列长度是 64,所以这里我设置为 128; 
  • –total_batch_size 4096 我们只是测试,所以这个值不需要太大,同样,这个值必须是 2 的幂否则会出错; 
  • –num_iterations 100 这个是训练步数,同样因为是测试所以我简单设置为100;
  • –flash 1 该值是是否开启闪光灯提醒,“1” 为开启,“0” 为关闭。 

运行结果:

​

可以看到,我们成功利用 GPU 训练出了我们专属金融的语言模型。现在我们拿出使用 CPU 进行训练的时间进行比较: 

之前的结果  

原来我们的 CPU 训练过程平均每步大概需要 8000 毫秒,而 GPU 训练每步只需要不到 80 毫秒。

虽然有些参数可能有点变化,但从每一步训练的时间不难看出,使用 GPU 会大大加快训练过程,几乎加速 100 倍以上!  

由于我们的模型只是一个简单的训练示例,并且还没有进行优化,因此无需创建 EA 策略进行测试,因为你可以想象结果一定很糟糕。

不过别担心,接下来的文章将讨论如何使用我们自己的数据对大型语言模型进行微调,然后创建 EA 并对其进行测试。  

请注意:  

如果这个地方报错 RuntimeError:HIP error: the operation cannot be performed in the present state.Compile with TORCH_USE_HIP_DSA to enable device-side assertions.  

可以尝试添加环境变量:  

export HSA_OVERRIDE_GFX_VERSION=11.0.0

export HIP_VISIBLE_DEVICES=0

export ROCM_PATH=/opt/rocm

export AMDGPU_TARGETS=gfx1100

或者在 train_gpt2.py 开头添加如下代码:  

from os import putenv

putenv(“HSA_OVERRIDE_GFX_VERSION”, “11.0.0”)  

其中 11.0.0 是 7900xtx 的 HSA,需要根据自己的设备查看 HSA,修改为合适的值。gfx1100 是 7900xtx 的 ISA,需要根据自己的硬件更改适当的值。 


总结

在本文中,我们讨论了如何使用我们自己设计的数据集在显卡上训练一个专属于我们自己的大型语言模型。当然我们也讨论了 AMD 显卡加速计算中的开发环境配置,补充了本系列第二篇中没有提到的部分,同时也完成了目前市场上主流的两款显卡(amd 和 nvidia)加速计算的环境配置。  

但因为这个演示示例还未经过优化,所以同样没有对模型进行评估,也没有根据模型制定 EA 策略并在 MetaTrader 客户端中进行测试,因为目前这个演示模型只是处于预训练阶段,所以这些操作没有必要,也未达到实用的程度。在后续的文章中,我们将讨论大型语言模型的微调并制定相应的 EA 策略并在 MetaTrader 客户端中进行测试。  

下篇文章再见! 

本文由MetaQuotes Ltd译自英文
原文地址: https://www.mql5.com/en/articles/13498

附加的文件 |
data_enc.py (2.87 KB)
llm_data.csv (1139.04 KB)
最近评论 | 前往讨论 (1)
yangqibiao
yangqibiao | 14 4月 2025 在 11:36
非常好的文章,并且非常具有阅读和学习价值,我很喜欢你们的关于人工智能和机器学习类的文章,谢谢提供,很有参考价值
禁忌搜索(TS) 禁忌搜索(TS)
本文讨论了禁忌搜索(Tabu Search)算法,这是一种最早且最为人所知的元启发式方法之一。我们将详细探讨该算法的运行过程,从选择初始解并探索邻近选项开始,重点介绍使用禁忌表。文章涵盖了该算法的关键方面及其特性。
数据科学和机器学习(第 28 部分):使用 AI 预测 EURUSD 的多个期货 数据科学和机器学习(第 28 部分):使用 AI 预测 EURUSD 的多个期货
众多人工智能模型的惯常做法是预测单一未来值。不过,在本文中,我们将钻研运用机器学习模型的更强大技术,即预测多个未来值。这种方式被称为多步预测,它令我们不仅能够预测明天的收盘价,还可以预测后天、及更久的收盘价。通过掌握多步骤预测,交易者和数据科学家能够获得更深入的见解,并制定更明智的决策,从而显著增强他们的预测能力和策略计划。
开发回放系统(第 60 部分):玩转服务(一) 开发回放系统(第 60 部分):玩转服务(一)
很长一段时间以来,我们一直在研究指标,但现在是时候让服务重新工作了,看看图表是如何根据提供的数据构建的。然而,由于整个事情并没有那么简单,我们必须注意了解前方等待我们的是什么。
在MQL5中实现基于抛物线转向指标(Parabolic SAR)和简单移动平均线(SMA)的快速交易策略算法 在MQL5中实现基于抛物线转向指标(Parabolic SAR)和简单移动平均线(SMA)的快速交易策略算法
在本文中,我们将在MQL5中开发一个快速交易EA,利用抛物线SAR和简单移动平均线(SMA)指标来创建一个响应迅速的交易策略。我们详细介绍了该策略的实施过程,包括指标的使用、信号的生成以及测试和优化过程。