English
preview
Integrieren Sie Ihr eigenes LLM in EA (Teil 4): Trainieren Sie Ihr eigenes LLM mit GPU

Integrieren Sie Ihr eigenes LLM in EA (Teil 4): Trainieren Sie Ihr eigenes LLM mit GPU

MetaTrader 5Handel | 29 Juli 2024, 11:13
19 0
Yuqiang Pan
Yuqiang Pan

Inhaltsverzeichnis



Einführung

Im vorigen Artikel haben wir kurz erörtert, wie man Datensätze für große Sprachmodelle erstellt, und anhand eines einfachen Beispiels demonstriert, wie man ein Sprachmodell nur mit einer CPU trainiert. Wir haben das Modell jedoch nicht getestet, da es sich in Wirklichkeit nur um ein vortrainiertes Modell handelte. In diesem Artikel setzen wir unsere Diskussion über die Modellschulung fort, diesmal unter Verwendung von GPUs zur Beschleunigung des Prozesses. Es ist wichtig, darauf hinzuweisen, dass dieses Modell als Demonstrationsbeispiel noch nicht aussagekräftig genug ist, weshalb wir in diesem Artikel nicht auf die Modellprüfung eingehen werden. Die Tests werden in späteren Artikeln behandelt.  

Die Einrichtung von CUDA-Beschleunigungsumgebungen haben wir bereits im zweiten Teil dieser Serie behandelt. Im Folgenden werden wir uns auf die Verwendung von AMD-Grafikkarten zur Beschleunigung von Schulungen konzentrieren, was als Ergänzung zu dem vorherigen Artikel dient. Derzeit ist die Einrichtung einer NVIDIA-Grafikkartenumgebung relativ einfach, während die Konfiguration einer Umgebung für AMD-Grafikkarten verschiedene Herausforderungen mit sich bringen kann. In diesem Artikel finden Sie Lösungen für häufige Probleme, mit denen Sie das Training für Ihr eigenes Finanzsprachmodell mit AMD-Grafikkarten reibungslos beschleunigen können. Wenn Sie NVIDIA-Grafikkarten verwenden, brauchen Sie sich keine Sorgen zu machen - die Trainingsmethoden sind dieselben. Solange Sie die CUDA Umgebung bereits eingerichtet haben, können Sie die in diesem Artikel enthaltenen Schulungsanweisungen befolgen, ohne sich mit den spezifischen Konfigurationsschritten für AMD-Karten befassen zu müssen.  

Sind Sie bereit los zu gehen? 


Vorbereitungen

In einem früheren Artikel dieser Serie haben wir die Einrichtung von NVIDIA-Umgebungen behandelt. Wir sollten jedoch nicht übersehen, dass einige Nutzer mit AMD-Hardware arbeiten. Daher werden wir auch die Einrichtung der ROCm (Radeon Open Compute)-Beschleunigungsumgebung besprechen. Bis jetzt gibt es keine ROCm-unterstützte PyTorch-Version für Windows, und auch WSL (Windows Subsystem for Linux) unterstützt ROCm noch nicht. Wenn Sie also ROCm für das Training großer Modelle verwenden möchten, ist Linux (insbesondere Ubuntu) derzeit die beste Option (Positiv zu vermerken ist, dass ROCm in der nächsten Version möglicherweise WSL-Unterstützung hinzufügen wird, aber die aktuellste Version ist 6.1.2, und ich erwarte nicht, dass die erste unterstützte Version optimal sein wird). Während meiner Nutzung bin ich auf mehrere Probleme im Zusammenhang mit AMD-Hardware gestoßen, die ich bei NVIDIA nicht hatte. Ich werde einige Lösungen vorstellen, die meiner Meinung nach für AMD-Nutzer hilfreich sein könnten. Auch wenn es etwas umständlich sein mag, denken Sie daran, dass wir Geld sparen wollen, oder? Ah-ha...  

Wenn Sie also das Training für große Sprachmodelle mit AMD-Grafikkarten beschleunigen möchten, finden Sie hier die notwendigen Vorbereitungen:     

1. Ubuntu installieren  

Sie müssen ein Ubuntu-System installieren. Die Einrichtung eines Dual-Boot-Systems mit Windows und Ubuntu auf demselben PC ist machbar und empfehlenswert. Es kann sein, dass wir auf Daten aus dem Windows-System zugreifen müssen, daher ist es nützlich, beide Betriebssystemoptionen zu haben. Ausführliche Anleitungen für die Einrichtung eines Dual-Boot-Systems sind im Internet weit verbreitet. Alternativ können Sie Ihr AMD-Gerät auch als Remote-Ubuntu-Host bereitstellen und als Remote-Entwicklungsumgebung verwenden. Sie können dann von Ihrem Windows-System aus über SSH eine Verbindung zu dem entfernten Host herstellen. Dieser Ansatz ähnelt der Verwendung von WSL unter Windows, mit dem entscheidenden Unterschied, dass AMD-Grafikkarten WSL nicht unterstützen. Ich habe die ROCm-Entwickler dazu befragt, und sie sagten, dass die WSL-Unterstützung derzeit in der Entwicklung ist (möglicherweise in der nächsten Version). Beachten Sie jedoch, dass Sie für diese Lösung möglicherweise mehrere Computer benötigen. Ich persönlich wende diese Methode an.  

2. Hardware-Konfiguration prüfen  

Seien Sie vorsichtig mit Ihrer Hardware-Konfiguration. Ich hatte zum Beispiel häufige Treiberabstürze mit meiner 7900XTX-Grafikkarte. Ursprünglich habe ich ein 850-W-Netzteil verwendet, das für eine einzelne GPU ausreichen sollte. Ich habe jedoch nicht bedacht, dass Treiberabstürze mit Problemen bei der Stromversorgung zusammenhängen könnten. Nachdem ich verschiedene Lösungen erfolglos ausprobiert hatte, schlug ein Freund vor, auf ein 1250-W-Netzteil aufzurüsten, und alles lief reibungslos.

Hier also ein aufrichtiger Ratschlag für alle Nutzer von AMD-Hardware: Vergewissern Sie sich, dass Ihre Stromversorgung für Ihre Geräte geeignet ist.  

3. ROCM und HIP   

Wenn Sie eine weniger komplizierte Einrichtung der Umgebung bevorzugen, können Sie das offizielle Docker-Image von AMD verwenden. Ziehen Sie einfach das offizielle ROCm-Container-Image mit Docker. Die meisten der erforderlichen Umgebungskonfigurationen sind bereits im Docker-Image eingerichtet, weshalb ich diesen Ansatz empfehle.

4. Hardware-Einstellungen

Bei der Nutzung des Geräts habe ich festgestellt, dass die Optimierung des AMDGPU-Treibers unter Ubuntu nicht so gut ist. Nehmen Sie meine 7900XTX als Beispiel: Obwohl das Gerät eine Leistung von 350 W erbringen kann, wurde die Standardeinstellung auf 303 W festgelegt. Außerdem lag die Lüfterdrehzahl selbst unter Volllast bei weniger als 45 %, und die Kerntemperatur blieb bei 100 °C. Für ein wirklich umfangreiches Modelltraining, das mehrere Stunden oder sogar Tage lang ununterbrochen laufen kann, ist die Aufrechterhaltung solch hoher Temperaturen für das Gerät riskant.  

Fühlen Sie sich jetzt dazu verleitet, die Hardware zu wechseln? Glauben Sie mir, da kommt noch mehr...  


Hardware-Konfiguration

1. Einstellung des Treibers

Bisher bietet der amdgpu-Treiber in Ubuntu einige externe Schnittstellen für GPU-Einstellungen. Die Konfigurationsdateien befinden sich in „/sys/class/drm/card0/device/hwmon/hwmon2/“. Beachten Sie, dass „hwmon2“ variieren kann; es könnte „hwmon1“ oder ein anderer Wert sein. Ich empfehle, die Lüftergeschwindigkeit und die Leistung entsprechend anzupassen, aber keine anderen Einstellungen zu verändern.  

Wir zeigen Ihnen, wie Sie die Lüftergeschwindigkeit einstellen. Für diese Dateioperationen sind Administratorrechte erforderlich, da Sie sonst keine Änderungen vornehmen können. Ich empfehle, für Änderungen den Nutzer root zu verwenden:    

  • Aktivieren Sie zunächst pwm1:echo „1“ > /sys/class/drm/card0/device/hwmon/hwmon2/pwm1_enable
  • Übernehmen Sie die Einstellung: echo „c“ > /sys/class/drm/card0/device/hwmon/hwmon2/pwm1_enable

Stellen Sie die Lüftergeschwindigkeit auf 128 ein, wobei der Wert von 0 bis 255 reichen kann, wobei 255 der maximalen Lüftergeschwindigkeit entspricht.

  • Passen Sie ihn an Ihre Bedürfnisse an: echo „128“ > /sys/class/drm/card0/device/hwmon/hwmon2/pwm1
  • Übernehmen Sie die Einstellung: echo „c“ > /sys/class/drm/card0/device/hwmon/hwmon2/pwm1     

Passen Sie die Leistungsgrenze an, wenn Ihr 7900XTX beispielsweise eine maximale Leistung von 350 W hat und auf 303 W voreingestellt ist:

  • Ändern Sie ihn auf 330W: echo „330000000“ > /sys/class/drm/card0/device/hwmon/hwmon2/power1_cap
  • Übernehmen Sie die Einstellung: echo „c“ > /sys/class/drm/card0/device/hwmon/hwmon2/power1_cap   

Anmerkung:   

1. Um Einstellungen rückgängig zu machen, verwenden Sie echo „r“ >, gefolgt von dem entsprechenden Pfad (z. B. echo „r“ > /sys/class/drm/card0/device/hwmon/hwmon2/pwm1_enable).  

2. Vermeiden Sie es, die Lüfterdrehzahlen gleichzeitig über die Schnittstellen „pwm1“ und „fan[1-*]_target“ einzustellen, da letztere die ersteren überschreibt.     

2. ROCM-SMI-Einstellungen

Im Folgenden finden Sie häufig verwendete Befehle für rocm-smi: 

Verwendung: 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]

Optionen einstellen:
  --setclock TYPE LEVEL                            Einstellen der Taktfrequenzstufe(n) für den angegebenen Takt (erfordert manuelle Perf-Stufe)
  --setsclk LEVEL [LEVEL ...]                      Einstellen der GPU-Taktfrequenzstufe(n) (erfordert manuelle Perf-Stufe)
  --setmclk LEVEL [LEVEL ...]                     Einstellen der GPU-Speichertaktfrequenzstufe(n) (erfordert manuelle Perf-Stufe)
  --setpcie LEVEL [LEVEL ...]                     SPCIE-Taktfrequenzstufe(n) einstellen (erfordert manuelle Perf-Stufe)
  --setslevel SCLKLEVEL SCLK SVOLT          Änderung der GPU-Taktfrequenz (MHz) und der Spannung (mV) für einen bestimmten Level
  --setmlevel MCLKLEVEL MCLK MVOLT       Ändern der GPU-Speichertaktfrequenz (MHz) und der Spannung (mV) für einen bestimmten Level
  --setvc POINT SCLK SVOLT                      SCLK-Spannungskurve (MHz mV) für einen bestimmten Punkt ändern
  --setsrange SCLKMIN SCLKMAX                 Einstellen der minimalen und maximalen SCLK-Geschwindigkeit
  --setextremum min|max sclk|mclk CLK    Einstellen der Mindest-/Maximalgeschwindigkeit von SCLK/MCLK
  --setmrange MCLKMIN MCLKMAX              Einstellen der minimalen und maximalen MCLK-Geschwindigkeit
  --setfan LEVEL                                        Einstellen der GPU-Lüftergeschwindigkeit (Stufe oder %)
  --setperflevel LEVEL                                Einstellen der Leistungsstufe
  --setoverdrive %                                      GPU-Overdrive-Level einstellen (erfordert manuellen|hohen Perf-Level)
  --setmemoverdrive %                               Einstellen der GPU-Speicherübertaktungsstufe (erfordert manuelle|high Perf-Stufe)
  --setpoweroverdrive WATTS                     Einstellen der maximalen GPU-Leistung mit Power OverDrive in Watt
  --setprofile SETPROFILE                          Angabe der Leistungsprofilstufe (#) oder eine in Anführungszeichen gesetzte Zeichenkette mit CUSTOM-Profilattributen „# # # #...“ (erfordert manuelle Perf-Stufe)

  --setperfdeterminism SCLK                     Setzt die Taktfrequenzgrenze, um minimale Leistungsschwankungen zu erhalten

  --setcomputepartition {CPX,SPX,DPX,TPX,QPX,cpx,spx,dpx,tpx,qpx}  Berechnungspartition festlegen
  --setmemorypartition {NPS1,NPS2,NPS4,NPS8,nps1,nps2,nps4,nps8}   Speicherpartition festlegen
  --rasenable BLOCK ERRTYPE                   Aktiviert RAS für den angegebenen Block und Fehlertyp
  --rasdisable BLOCK ERRTYPE                  Deaktiviert RAS für den angegebenen Block und Fehlertyp
  --rasinject BLOCK                                   RAS-Gift für den angegebenen Block injizieren (funktioniert NUR auf unsicheren Boards)

Optionen zurücksetzen:
  -r, --resetclocks                                               Uhren und OverDrive auf Standardwerte zurücksetzen
  --resetfans                                                      Zurücksetzen der Lüfter auf automatische Steuerung (Treiber)
  --resetprofile                                                   Energieprofil auf Standard zurücksetzen
  --resetpoweroverdrive                                     Setzt die maximale GPU-Leistung auf den Zustand der Taubheit des Geräts zurück
  --resetxgmierr                                               XGMI-Fehlerzählung zurücksetzen
  --resetperfdeterminism                                   Voreinstellung deaktivieren
  --resetcomputepartition                                  Setzt den Status der Rechenpartition beim Booten zurück
  --resetmemorypartition                                   Zurücksetzen auf den Zustand der Boot-Speicherpartition

Optionen für die automatische Beantwortung:
  --autorespond RESPONSE                            Antwort, die automatisch auf alle Aufforderungen erfolgt (NICHT EMPFOHLEN)

Ausgabeoptionen:
  --loglevel LEVEL                                            Wie viele Ausgaben für das, was das Programm gerade macht, ausgegeben werden, eine von debug/info/warning/error/critical
  --json                                                          Ausgabe im JSON-Format drucken
  --csv                                                             Ausgabe im CSV-Format drucken

         

3. AMD-SMI-Einstellungen

Basierend auf der aktuellen Entwicklungsrichtung von ROCm, ist es möglich, dass amd-smi rocm-smi ersetzen wird. Im Folgenden finden Sie häufig verwendete Befehle für amd-smi: 

Verwendung: 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]

Um eine Konfiguration festzulegen, muss eine GPU angegeben werden.                                    
Es muss ein Mengenargument angegeben werden; mehrere Mengenargumente sind zulässig

Argumente setzen:
  -h, --help                                         diese Hilfemeldung anzeigen und beenden
  -g, --gpu GPU [GPU ...]                     Wählen Sie eine GPU-ID, BDF oder UUID aus den möglichen Optionen aus
  -f, --fan %                                        Einstellen der GPU-Lüftergeschwindigkeit (0-255 oder 0-100%)
  -l, --perf-level                       LEVEL Einstellen der Leistungsstufe
  -P, --profile SETPROFILE                   Einstellen des Leistungsprofils (#) oder einer in Anführungszeichen gesetzten Zeichenkette mit nutzerdefinierten Profilattributen
  -d, --perf-determinism SCLKMAX      Begrenzung der GPU-Taktfrequenz und des Leistungsniveaus auf Determinismus setzen, um minimale Leistungsschwankungen zu erhalten
  -C, --compute-partition PARTITION   Legen Sie einen der folgenden Modi für die Berechnungspartition fest: CPX, SPX, DPX, TPX, QPX
  -M, --memory-partition PARTITION    Stellen Sie einen der folgenden Speicherpartitionsmodi ein: NPS1, NPS2, NPS4, NPS8
  -o, --power-cap WATTS                     Begrenzung der Leistungskapazität einstellen
  -p, --dpm-policy POLICY_ID              Festlegen der GPU-DPM-Richtlinie anhand der Richtlinien-ID
  -x, --xgmi-plpd POLICY_ID                Einstellen der GPU-XGMI-Per-Link-Power-Down-Policy unter Verwendung der Policy-ID

Befehlsmodifikatoren:
  --json                             Zeigt die Ausgabe im JSON-Format an (standardmäßig für Menschen lesbar).
  --csv                              Zeigt die Ausgabe im CSV-Format an (standardmäßig für Menschen lesbar).
  --file FILE                      Speichert die Ausgabe in eine Datei im angegebenen Pfad (standardmäßig stdout).
  --loglevel             LEVEL Legen Sie die Protokollierungsstufe aus den möglichen Auswahlen fest: DEBUG, INFO, WARNUNG, FEHLER, KRITISCH

  

Anmerkung:  

Es ist erwähnenswert, dass einige Einstellungen bei der Verwendung von amd-smi fehlschlagen, aber mit rocm-smi erfolgreich sind. Zum Beispiel: sudo amd-smi set -g 0 -f 90% fehlgeschlagen: "ValueError: Unable to set fan speed 229 on GPU ID: 0 BDF:0000:03:00.0“ In solchen Fällen wechseln Sie zur Verwendung von rocm-smi: sudo rocm-smi --setfan 90%. Es funktioniert!


4. Software-unterstützende Hardware-Einstellungen

In Ubuntu gibt es auch UI-basierte Verwaltungswerkzeuge. Wir werden in diesem Artikel nicht näher auf sie eingehen, aber interessierte Nutzer können die folgenden Optionen erkunden:  

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

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


Entwicklungsumgebung

Sobald Ihre Hardware eingerichtet ist, müssen Sie die folgende Umgebung auf Ihrem System für die GPU-Beschleunigung konfigurieren. Nehmen wir weiterhin AMD-Geräte als Beispiel:

  • Treiberunterstützung für Accelerated Computing: Wir müssen den amdgpu DKMS-Treiber und das ROCm HIP SDK installieren.
  • Für Python-Bibliotheken, die das beschleunigte Rechnen unterstützen: PyTorch wurde mit ROCm kompiliert; wenn Sie eine Quantisierung für Modelle benötigen, sollten Sie bitsandbytes (mit ROCm kompiliert) verwenden. Für beschleunigte Berechnungen benötigen Sie möglicherweise flash-attention und triton (beide mit ROCm kompiliert). Während der Inferenzprüfung können Sie vllm verwenden. In unserem Beispiel sollte die Installation von PyTorch genügen.

1. Installation von Treibern und Abhängigkeiten

Prüfen Sie, ob Ihre Hardware und Ihr System von der neuesten ROCm-Version unterstützt werden. Wenn keine Version Ihr Gerät unterstützt, dann herzlichen Glückwunsch - Sie sind endlich von AMDs Qualen befreit! Wenn Ihr Gerät ROCm-unterstützt ist, haben Sie zwei Möglichkeiten: Stellen Sie die Umgebung mit Docker bereit und installieren Sie sie direkt auf dem lokalen Host. Die Schritte sind ähnlich, unabhängig davon, ob Sie die Installation lokal oder in einem Docker-Container durchführen. Ich empfehle jedoch dringend die Verwendung von Docker. Wenn Sie während des Betriebs Fehler machen, können Sie den Container einfach löschen und einen neuen aus dem bereits gezogenen Ubuntu-Image starten — Sie müssen das System nicht neu installieren! Daher konzentriert sich dieser Artikel auf die Bereitstellung der Entwicklungsumgebung mit Docker. Verwenden Sie bei der Installation von Docker die Docker Engine (nicht Docker Desktop). Siehe die Installationsanleitung: https://docs.docker.com/engine/install.


2. Ziehen Sie das Basis-Image

Ziehen Sie das Ubuntu 22.04 Basis-Image: docker pull ubuntu:22.04  

Anmerkung:

Wenn Sie eine nicht angepasste Bereitstellung bevorzugen, ziehen Sie direkt das ROCm/PyTorch-Image:docker pull rocm/pytorch:latest.

Starten Sie dann den Container:

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

Innerhalb des Docker-Containers sind die meisten Entwicklungsumgebungen bereits konfiguriert. Sie können llm.c entweder in den Container kopieren oder mit Git aus dem offiziellen Repository klonen. Fahren Sie dann direkt mit dem Abschnitt Modelltraining fort. Wenn Sie jedoch auf ungewöhnliche Probleme stoßen, werden Sie nicht wissen, wie Sie diese beheben können. Deshalb empfehle ich Ihnen, Schritt für Schritt vorzugehen, damit Sie immer wissen, wo Sie Lösungen finden.

3. Einen Container erstellen

Führen Sie den folgenden Befehl aus, um einen Container zu erstellen (Sie können einen anderen Namen wählen, wenn Sie möchten):

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  

Anmerkung:

„--name llmc“ ist optional, es benennt den erstellten Container „llmc“. Wenn Sie diesen Parameter weglassen, wird der Container einen zufälligen Namen erhalten.   Ich empfehle die Verwendung von --network=host, um den Netzwerkzugang vom Container zum Host zu vereinfachen. Andernfalls ist der Standard-Netzwerkmodus „bridged“, was den Netzwerkzugriff des Containers auf den Host erschwert (z.B. den Zugriff auf den Netzwerkproxy des Hosts). „--ipc=host“ erlaubt dem Container, den Speicher mit dem Host zu teilen, was die Effizienz verbessert. Allerdings wird dadurch die Sicherheit verringert. Verwenden Sie es je nach Bedarf. 


4. Treiberinstallation und ROCm-Setup    

Installieren Sie die erforderlichen Software-Abhängigkeiten. Wenn Sie auf dem Host installieren, stellen Sie den Befehlen das Präfix sudo voran:

apt install wget

apt install gpg

Konfigurieren Sie das APT-Repository amdgpu:

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  

Installieren Sie den amdgpu-Treiber: 

apt install amdgpu-dkms

Wenn Sie die Installation auf dem lokalen Host durchführen, starten Sie das System neu: reboot.

Installieren Sie ROCm (ich habe rocm-hip-sdk gewählt):  

apt install rocm-hip-sdk

Natürlich haben Sie auch andere Möglichkeiten:  

  • rocm:Alle ROCm Kernpakete, Werkzeuge und Bibliotheken.
  • rocm-language-runtime:Die ROCm-Runtime.
  • rocm-developer-tools:Debuggen und Profilieren von HIP-Anwendungen.
  • rocm-hip-runtime:Ausführen von HIP-Anwendungen, die für die AMD-Plattform geschrieben wurden.
  • rocm-hip-runtime-devel:Entwickeln Sie Anwendungen auf HIP oder portieren Sie von CUDA.
  • rocm-opencl-runtime:Ausführen von OpenCL-basierten Anwendungen auf der AMD-Plattform.
  • rocm-opencl-sdk:Entwickeln Sie OpenCL-basierte Anwendungen für die AMD-Plattform.
  • rocm-hip-libraries:HIP-Bibliotheken, optimiert für die AMD-Plattform.
  • rocm-hip-sdk:Entwickeln oder portieren Sie HIP-Anwendungen und -Bibliotheken für die AMD-Plattform.
  • rocm-ml-libraries:Schlüsselbibliotheken für maschinelles Lernen. Enthält MIOpen.
  • rocm-ml-sdk:Entwickeln und Ausführen von Machine-Learning-Anwendungen für AMD.
  • rocm-openmp-runtime:Ausführen von OpenMP-basierten Anwendungen auf der AMD-Plattform.
  • rocm-openmp-sdk:Entwickeln Sie OpenMP-basierte Anwendungen für die AMD-Software.

Fügen Sie nach der Installation die folgenden Umgebungsvariablen hinzu:  

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

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

ldconfig

Prüfen Sie den DKMS-Status:

dkms status

Fügen Sie Binärpfade zur Umgebungsvariablen PATH hinzu:

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

Überprüfen Sie die Installation: /opt/rocm-6.1.1/bin/rocminfo /opt/rocm-6.1.1/bin/clinfo  

5. Installation von PyTorch

Wenn Python nicht installiert ist, verwenden Sie apt, um es zu installieren, oder richten Sie eine Conda-Umgebung (Miniconda) ein: apt install libjpeg-dev python3-dev python3-pip  

Als Nächstes sollten Sie auf der offiziellen PyTorch-Website nachsehen, ob Ihre ROCm-Version unterstützt wird. Im Moment unterstützt die offizielle Version noch nicht ROCm 6.1.1, also installieren wir die Vorschauversion:  

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

torch

Wenn Ihre ROCm-Version niedriger ist als die offiziell unterstützte Version, passen Sie den Installationsbefehl entsprechend an. Wenn der offizielle Freigabebefehl zum Beispiel lautet: pip3 install torch --index-url https://download.pytorch.org/whl/rocm6.0, und Ihre ROCm-Version ist „5.7.*“, können Sie wie folgt installieren:  

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


Wenn das Problem „NameError: name 'amdsmi' is not defined“ auftritt, liegt das daran, dass neuere Torch Versionen Python-Unterstützung für amdsmi benötigen. Leider wird die direkte Verwendung von pip nicht funktionieren. Navigieren Sie zu /opt/rocm/share/amd_smi und installieren Sie amd-smi-lib:  

apt install amd-smi-lib  

Wenn Sie mit der Standard-Python-Version des Hosts installieren:  

python3 -m pip install --user . 

Wenn ein Berechtigungsfehler auftritt wie:  

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

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

Führen Sie den folgenden Befehl mit Root-Rechten aus:  

sudo python3 -m pip install --user .  

Wenn Python3 nicht gefunden wird, verwenden Sie:  

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

Wenn Sie eine Conda-Umgebung verwenden (z.B. mit dem Namen „train_llm“), installieren Sie wie folgt:  

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

Ersetzen Sie den Pfad durch den Python-Pfad Ihrer spezifischen virtuellen Umgebung.

Schließlich versuchen Sie es erneut:  

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

  

Training des Modells

Ähnlich wie im vorherigen Artikel werden wir das Open-Source-Projekt „llm.c“ verwenden. Ich persönlich finde dieses Projekt ausgezeichnet - die Logik des Codes ist klar, und die Kommentare sind detailliert, sodass sie leicht zu lesen sind. Interessierte Leser können den gesamten Quellcode dieses Projekts erforschen, um ein klares Verständnis für den gesamten Prozess des Trainings großer Sprachmodelle zu erlangen. Ich werde hier nicht den Code für jeden Trainingsschritt wiederholen, die Kommentare im Quellcode sind bereits recht eindeutig.  

Um das „llm.c“-Repository herunterzuladen, sollte man nicht direkt das offizielle Repository git, sondern das Projekt „https://github.com/anthonix/llm.c“ verwenden, das AMD-Geräte unterstützt. Wenn Sie Probleme mit dem Training haben, können Sie zu der von mir verwendeten Quellcode-Version wechseln. Die aktuelle Version, die ich verwende, ist „37dfcf6“:

cd llm.c
git checkout 37dfcf6

Wenn Sie die Version wechseln müssen, verwenden Sie die folgende Befehlszeile, nachdem Sie das Projekt mit git clone heruntergeladen haben:

1. Projektabhängigkeiten installieren

Installieren Sie zunächst die Projektabhängigkeiten:  

pip install -r requirements.txt 

Beachten Sie, dass Sie Torch zuerst installieren sollten, bevor Sie die Abhängigkeiten aus requirements.txt installieren, um Versionskonflikte zu vermeiden.

Als Nächstes kompilieren Sie das Projekt:  

make train_gpt2amd AMDGPU_TARGETS=gfx1100 

Um Ihre spezifische ISA (Instruction Set Architecture) zu ermitteln, verwenden Sie rocminfo und filtern die Ausgabe mit grep:  

rocminfo | grep Name:  

2. Vorbereitung des Trainings

Dieser Schritt ähnelt dem Training auf einer CPU, sodass ich hier nicht ins Detail gehen werde. Wenn Sie eine umfassende Erklärung benötigen, lesen Sie bitte den vorherigen Artikel. Nachfolgend finden Sie den Trainingsbefehl.

Holen der Daten:

python data_enc

Vorbereiten des Trainings:

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

 Ersetzen Sie „data/val_data.bin“ durch den Ausgabepfad nach Ausführung von data_enc.   

Führen Sie den folgenden Befehl aus: 

make train_gpt2amd AMDGPU_TARGETS=gfx1100  

Ersetzen Sie wiederum gfx1100 durch Ihren spezifischen ISA, den Sie von rocminfo erhalten haben.   

Anmerkung:  

Wenn der Fehler „fatal error: 'cmath' file not found“ auftritt, liegt das wahrscheinlich an einer nicht passenden g++-Version. Einige Ubuntu-Versionen werden mit g++11, aber nicht mit g++12 ausgeliefert. Installieren Sie g++12 und legen Sie es als Standardversion fest: 

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 
Ignorieren Sie „4 warnings generated when compiling for host.“ und führen Sie den folgenden Befehl aus:  
./train_gpt2amd  

Als ich den letzten Befehl ausführte, erhielt ich einen Programmabsturz mit „[CUDA ERROR] at file build/hip/llmc/layernorm.cuh:400“. Wenn Sie die Entscheidung für AMD-Hardware zu diesem Zeitpunkt bereuen, glauben Sie mir, dass dies erst der Anfang ist - viele weitere Herausforderungen warten auf Sie... Die Reise mit AMD-Hardware hat gerade erst begonnen!  

Wenn es Ihnen gelingt, diese erfolgreich durchzuführen, ist das großartig! Wenn nicht, lassen Sie sich nicht entmutigen, wir können immer noch Python-Skripte für das Training des Modells verwenden.   

Wenn Sie Python-Skripte zum Trainieren des Modells verwenden, können Sie den folgenden Befehl ausführen:  

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

Hier sind einige Parameter, die erwähnt werden müssen:  

  • -input_bin „./data/train_data.bin“ Dies ist unser Trainingsdatensatz;
  • -input_val_bin „./data/val_data.bin“ Dies ist unser Validierungsdatensatz;
  • -val_loss_every 10 Druckt den Verlust nach einer bestimmten Anzahl von Schritten;
  • -batch_size 16 Dieser Wert muss eine Potenz von 2 sein, sonst tritt ein Fehler auf. Da wir nur testen und der Datensatz nicht groß ist, muss er nicht zu groß sein;
  • -sequence_length 128 Dieser Wert muss eine Potenz von 2 sein, da sonst ein Fehler auftritt, da die Sequenzlänge unseres Datensatzes 64 beträgt, also habe ich ihn hier auf 128 gesetzt; 
  • -total_batch_size 4096 Da es sich nur um einen Test handelt, darf dieser Wert nicht zu groß sein. Ebenso muss dieser Wert eine Potenz von 2 sein, da sonst ein Fehler auftritt; 
  • -num_iterations 100 Dies ist die Anzahl der Trainingsschritte, und da es sich um einen Test handelt, habe ich sie einfach auf 100 gesetzt;
  • -flash 1 Dieser Wert gibt an, ob der Blitz eingeschaltet werden soll, „1“ bedeutet, dass er eingeschaltet wird, „0“ bedeutet, dass er ausgeschaltet wird. 

Die laufenden Ergebnisse:

re

Wie Sie sehen können, haben wir erfolgreich ein Finanz-Sprachmodell trainiert, das nur uns zur Verfügung steht und GPU verwendet. Ziehen wir nun die Zeit ab, die wir für das Training mit der CPU verwendet haben, um zu vergleichen:  

alt  

Ursprünglich dauerte unser CPU-Trainingsprozess im Durchschnitt etwa 8000 ms pro Schritt, während das GPU-Training weniger als 80 ms pro Schritt benötigte.

Auch wenn sich einige Parameter ein wenig geändert haben, ist es nicht schwer zu erkennen, dass der Einsatz eines Grafikprozessors den Trainingsprozess erheblich beschleunigt, und zwar um mehr als das Hundertfache!  

Da es sich bei unserem Modell nur um ein einfaches Beispiel handelt, das trainiert und nicht optimiert wurde, ist es nicht notwendig, eine EA-Strategie zum Testen zu erstellen, denn Sie können sich vorstellen, dass das Ergebnis sehr schlecht sein muss.

Aber keine Sorge, in den folgenden Artikeln wird erörtert, wie wir ein großes Sprachmodell anhand unserer eigenen Daten feinabstimmen und dann einen EA erstellen und testen können.  

Anmerkung:  

Wenn diese Stelle einen Fehler meldet RuntimeError: HIP-Fehler: Die Operation kann im gegenwärtigen Zustand nicht durchgeführt werden. Kompilieren Sie mit TORCH_USE_HIP_DSA, um geräteseitige Erklärungen zu aktivieren.  

Versuchen Sie, Umgebungsvariablen hinzuzufügen:  

export HSA_OVERRIDE_GFX_VERSION=11.0.0

export HIP_VISIBLE_DEVICES=0

export ROCM_PATH=/opt/rocm

export AMDGPU_TARGETS=gfx1100

Oder fügen Sie den folgenden Code am Anfang von train_gpt2.py ein:  

from os import putenv

putenv(“HSA_OVERRIDE_GFX_VERSION”, “11.0.0”)  

Wo 11.0.0 die HSA des 7900xtx ist, müssen Sie die HSA für Ihr eigenes Gerät überprüfen und auf den entsprechenden Wert ändern. Die gfx1100 ist der ISA der 7900xtx, Sie müssen den entsprechenden Wert entsprechend Ihrer eigenen Hardware ändern.  


Zusammenfassung

In diesem Artikel haben wir erörtert, wie man ein großes Sprachmodell, das nur uns zur Verfügung steht, auf einer Grafikkarte trainieren kann, indem man einen von uns entwickelten Datensatz verwendet. Natürlich haben wir auch die Konfiguration der Entwicklungsumgebung für das Accelerated Computing mit AMD-Grafikkarten besprochen, den Teil ergänzt, der im zweiten Teil dieser Serie nicht erwähnt wurde, und auch die Konfiguration der Umgebung der beiden Mainstream-Grafikkarten (amd und nvidia) auf dem aktuellen Markt für Accelerated Computing abgeschlossen.  

Da dieses Demonstrationsbeispiel jedoch nicht optimiert wurde, hat derselbe weder das Modell evaluiert, noch eine EA-Strategie auf der Grundlage des Modells formuliert und im MetaTrader-Client getestet, da sich dieses Demonstrationsmodell derzeit nur in der Pre-Trainingsphase befindet, sodass diese Vorgänge unnötig sind und kein praktisches Niveau erreicht haben. In den folgenden Artikeln werden wir die Feinabstimmung von großen Sprachmodellen besprechen und entsprechende EA-Strategien formulieren und im MetaTrader-Client testen.  

Wir sehen uns in unserem nächsten Artikel! 

Übersetzt aus dem Englischen von MetaQuotes Ltd.
Originalartikel: https://www.mql5.com/en/articles/13498

Beigefügte Dateien |
data_enc.py (2.87 KB)
llm_data.csv (1139.04 KB)
Die Übertragung der Trading-Signale in einem universalen Expert Advisor. Die Übertragung der Trading-Signale in einem universalen Expert Advisor.
In diesem Artikel wurden die verschiedenen Möglichkeiten beschrieben, um die Trading-Signale von einem Signalmodul des universalen EAs zum Steuermodul der Positionen und Orders zu übertragen. Es wurden die seriellen und parallelen Interfaces betrachtet.
Aufbau des Kerzenmodells Trend-Constraint (Teil 5): Nachrichtensystem (Teil I) Aufbau des Kerzenmodells Trend-Constraint (Teil 5): Nachrichtensystem (Teil I)
Wir werden den Hauptcode von MQL5 in bestimmte Codeschnipsel aufteilen, um die Integration von Telegram und WhatsApp für den Empfang von Signalnachrichten von dem Trend Constraint-Indikator zu veranschaulichen, den wir in dieser Artikelserie erstellen. Dies wird sowohl Anfängern als auch erfahrenen Entwicklern helfen, das Konzept leicht zu verstehen. Zunächst werden wir die Einrichtung von MetaTrader 5 für Nachrichten und deren Bedeutung für den Nutzer behandeln. Dies wird den Entwicklern helfen, im Voraus Notizen zu machen, die sie dann in ihren Systemen anwenden können.
Eine alternative Log-datei mit der Verwendung der HTML und CSS Eine alternative Log-datei mit der Verwendung der HTML und CSS
In diesem Artikel werden wir eine sehr einfache, aber leistungsfähige Bibliothek zur Erstellung der HTML-Dateien schreiben, dabei lernen wir auch, wie man eine ihre Darstellung einstellen kann (nach seinem Geschmack) und sehen wir, wie man es leicht in seinem Expert Advisor oder Skript hinzufügen oder verwenden kann.
Neuronale Netze leicht gemacht (Teil 79): Feature Aggregated Queries (FAQ) im Kontext des Staates Neuronale Netze leicht gemacht (Teil 79): Feature Aggregated Queries (FAQ) im Kontext des Staates
Im vorigen Artikel haben wir eine der Methoden zur Erkennung von Objekten in einem Bild kennengelernt. Die Verarbeitung eines statischen Bildes ist jedoch etwas anderes als die Arbeit mit dynamischen Zeitreihen, wie z. B. die Dynamik der von uns analysierten Preise. In diesem Artikel werden wir uns mit der Methode der Objekterkennung in Videos befassen, die dem Problem, das wir lösen wollen, etwas näher kommt.