Sie fragen - wir antworten!

Apps & Leitfäden

Intel Habana Gaudi 2: installieren und testen

Bevor Sie mit der Installation der Gaudi 2 Accelerators Software beginnen, sollten Sie eine wichtige Funktion erwähnen. Wir sind daran gewöhnt, dass das Training und die Inferenz von neuronalen Netzen mit GPUs durchgeführt werden können. Intel Habana Gaudi 2 unterscheidet sich jedoch stark von GPUs und stellt eine andere Klasse von Geräten dar, die ausschließlich für die Beschleunigung von KI-Aufgaben konzipiert sind.

Viele bekannte Anwendungen und Frameworks funktionieren nicht ohne vorherige Vorbereitung des Betriebssystems und in einigen Fällen auch nicht ohne ein spezielles GPU Migration Toolkit. Dies erklärt die große Anzahl von Vorbereitungsschritten, die wir in diesem Artikel beschreiben. Beginnen wir der Reihe nach.

Schritt 1. SynapseAI Software Stack installieren

Um mit Intel Habana Gaudi 2 Beschleunigern arbeiten zu können, müssen Sie den SynapseAI Stack installieren. Er umfasst einen speziellen Graphen-Compiler, der die Topologie des neuronalen Netzwerkmodells umwandelt, um die Ausführung auf der Gaudi-Architektur effektiv zu optimieren, API-Bibliotheken für die horizontale Skalierung sowie ein separates SDK für die Erstellung von Hochleistungsalgorithmen und maschinellen Lernmodellen.

Unabhängig davon ist SynapseAI der Teil, der es Ihnen ermöglicht, eine Brücke zwischen beliebten Frameworks wie PyTorch/TensorFlow und den Gaudi 2 AI-Beschleunigern zu schlagen. Dadurch können Sie mit vertrauten Abstraktionen arbeiten, und Gaudi 2 optimiert unabhängig Berechnungen. Spezifische Operatoren, für die Beschleuniger keine Hardwareunterstützung haben, werden auf der CPU ausgeführt.

Um die Installation der einzelnen SynapseAI-Komponenten zu vereinfachen, wurde ein praktisches Shell-Skript erstellt. Lassen Sie es uns herunterladen:

wget -nv https://vault.habana.ai/artifactory/gaudi-installer/latest/habanalabs-installer.sh

Machen Sie die Datei ausführbar:

chmod +x habanalabs-installer.sh

Führen Sie das Skript aus:

./habanalabs-installer.sh install --type base

Folgen Sie den Anweisungen des Systems während der Installation. Sie finden einen detaillierten Bericht in der Protokolldatei. Darin können Sie sehen, welche Pakete installiert wurden, und ob die Beschleuniger erfolgreich gefunden und initialisiert wurden.

Protokolle hier: /var/log/habana_logs/install-YYYY-MM-DD-HH-MM-SS.log

[  +3.881647] habanalabs hl5: Found GAUDI2 device with 96GB DRAM
[  +0.008145] habanalabs hl0: Found GAUDI2 device with 96GB DRAM
[  +0.032034] habanalabs hl3: Found GAUDI2 device with 96GB DRAM
[  +0.002376] habanalabs hl4: Found GAUDI2 device with 96GB DRAM
[  +0.005174] habanalabs hl1: Found GAUDI2 device with 96GB DRAM
[  +0.000390] habanalabs hl2: Found GAUDI2 device with 96GB DRAM
[  +0.007065] habanalabs hl7: Found GAUDI2 device with 96GB DRAM
[  +0.006256] habanalabs hl6: Found GAUDI2 device with 96GB DRAM

Genauso wie das nvidia-smi-Dienstprogramm Informationen über installierte GPUs und laufende Rechenprozesse liefert, hat SynapseAI ein ähnliches Programm. Sie können es ausführen, um einen Bericht über den aktuellen Zustand der Gaudi 2 AI-Beschleuniger zu erhalten:

hl-smi
hl-smi screenshot

Schritt 2. TensorFlow-Test

TensorFlow ist eine der beliebtesten Plattformen für maschinelles Lernen. Mit dem gleichen Installationsskript können Sie eine vorgefertigte Version von TensorFlow mit Unterstützung für Gaudi 2 Beschleuniger installieren. Lassen Sie uns mit der Installation der allgemeinen Abhängigkeiten beginnen:

./habanalabs-installer.sh install -t dependencies

Als nächstes werden wir die Abhängigkeiten für TensorFlow installieren:

./habanalabs-installer.sh install -t dependencies-tensorflow

Installieren Sie die TensorFlow Plattform innerhalb einer virtuellen Umgebung, die mit dem Python Virtual Environment (venv) Mechanismus implementiert wurde:

./habanalabs-installer.sh install --type tensorflow --venv

Lassen Sie uns die erstellte virtuelle Umgebung aktivieren:

source habanalabs-venv/bin/activate

Erstellen Sie ein einfaches Python-Codebeispiel, das die Fähigkeiten der Gaudi 2-Beschleuniger nutzt:

nano example.py

import torch
import torch.nn as nn
import torch.optim as optim
import torch.nn.functional as F
import torchvision
import torchvision.transforms as transforms
import os
# Import Habana Torch Library
import habana_frameworks.torch.core as htcore
class SimpleModel(nn.Module):
   def __init__(self):
       super(SimpleModel, self).__init__()
       self.fc1   = nn.Linear(784, 256)
       self.fc2   = nn.Linear(256, 64)
       self.fc3   = nn.Linear(64, 10)
   def forward(self, x):
       out = x.view(-1,28*28)
       out = F.relu(self.fc1(out))
       out = F.relu(self.fc2(out))
       out = self.fc3(out)
       return out
def train(net,criterion,optimizer,trainloader,device):
   net.train()
   train_loss = 0.0
   correct = 0
   total = 0
   for batch_idx, (data, targets) in enumerate(trainloader):
       data, targets = data.to(device), targets.to(device)
       optimizer.zero_grad()
       outputs = net(data)
       loss = criterion(outputs, targets)
       loss.backward()
       # API call to trigger execution
       htcore.mark_step()
       optimizer.step()
       # API call to trigger execution
       htcore.mark_step()
       train_loss += loss.item()
       _, predicted = outputs.max(1)
       total += targets.size(0)
       correct += predicted.eq(targets).sum().item()
   train_loss = train_loss/(batch_idx+1)
   train_acc = 100.0*(correct/total)
   print("Training loss is {} and training accuracy is {}".format(train_loss,train_acc))
def test(net,criterion,testloader,device):
   net.eval()
   test_loss = 0
   correct = 0
   total = 0
   with torch.no_grad():
       for batch_idx, (data, targets) in enumerate(testloader):
           data, targets = data.to(device), targets.to(device)
           outputs = net(data)
           loss = criterion(outputs, targets)
           # API call to trigger execution
           htcore.mark_step()
           test_loss += loss.item()
           _, predicted = outputs.max(1)
           total += targets.size(0)
           correct += predicted.eq(targets).sum().item()
   test_loss = test_loss/(batch_idx+1)
   test_acc = 100.0*(correct/total)
   print("Testing loss is {} and testing accuracy is {}".format(test_loss,test_acc))
def main():
   epochs = 20
   batch_size = 128
   lr = 0.01
   milestones = [10,15]
   load_path = './data'
   save_path = './checkpoints'
   if(not os.path.exists(save_path)):
       os.makedirs(save_path)
   # Target the Gaudi HPU device
   device = torch.device("hpu")
   # Data
   transform = transforms.Compose([
       transforms.ToTensor(),
   ])
   trainset = torchvision.datasets.MNIST(root=load_path, train=True,
                                           download=True, transform=transform)
   trainloader = torch.utils.data.DataLoader(trainset, batch_size=batch_size,
                                           shuffle=True, num_workers=2)
   testset = torchvision.datasets.MNIST(root=load_path, train=False,
                                       download=True, transform=transform)
   testloader = torch.utils.data.DataLoader(testset, batch_size=batch_size,
                                           shuffle=False, num_workers=2)
   net = SimpleModel()
   net.to(device)
   criterion = nn.CrossEntropyLoss()
   optimizer = optim.SGD(net.parameters(), lr=lr,
                       momentum=0.9, weight_decay=5e-4)
   scheduler = torch.optim.lr_scheduler.MultiStepLR(optimizer, milestones=milestones, gamma=0.1)
   for epoch in range(1, epochs+1):
       print("=====================================================================")
       print("Epoch : {}".format(epoch))
       train(net,criterion,optimizer,trainloader,device)
       test(net,criterion,testloader,device)
       torch.save(net.state_dict(), os.path.join(save_path,'epoch_{}.pth'.format(epoch)))
       scheduler.step()
if __name__ == '__main__':
   main()

Führen Sie schließlich die Anwendung aus:

python3 example.py

Um die virtuelle Umgebung zu beenden, führen Sie den folgenden Befehl aus:

deactivate

Schritt 3. Trainings-Repository klonen

Klonen Sie das Repository mit dem MLperf-Code:

git clone https://github.com/mlcommons/training_results_v3.0

Erstellen Sie ein separates Verzeichnis, das vom Docker-Container mit MLperf verwendet werden soll:

mkdir -p mlperf

Wechseln Sie das Verzeichnis:

cd mlperf

Lassen Sie uns einige Umgebungsvariablen exportieren:

export MLPERF_DIR=/home/usergpu/mlperf
export SCRATCH_DIR=/home/usergpu/mlperf/scratch
export DATASETS_DIR=/home/usergpu/mlperf/datasets

Erstellen Sie neue Verzeichnisse unter Verwendung der erstellten Variablen:

mkdir -p $MLPERF_DIR/Habana
mkdir -p $SCRATCH_DIR
mkdir -p $DATASETS_DIR

Kopieren Sie die Benchmark-Anwendung nach $MLPERF_DIR/Habana:

cp -R training_results_v3.0/Intel-HabanaLabs/benchmarks/ $MLPERF_DIR/Habana

Exportieren Sie eine weitere Variable, in der ein Link zum Herunterladen der gewünschten Version des Docker-Containers gespeichert wird:

export MLPERF_DOCKER_IMAGE=vault.habana.ai/gaudi-docker-mlperf/ver3.1/pytorch-installer-2.0.1:1.13.99-41

Schritt 4. Docker installieren

Unsere Instanz läuft unter Ubuntu Linux 22.04 LTS und unterstützt Docker standardmäßig nicht. Bevor Sie also Container herunterladen und ausführen können, müssen Sie die Docker-Unterstützung installieren. Aktualisieren Sie den Paket-Cache und installieren Sie einige grundlegende Pakete, die Sie später benötigen werden:

sudo apt update && sudo apt -y install apt-transport-https ca-certificates curl software-properties-common

Um Docker zu installieren, müssen Sie ein digital signiertes Projekt-Repository hinzufügen. Laden Sie den Schlüssel für die digitale Signatur herunter und fügen Sie ihn dem Schlüsselspeicher des Betriebssystems hinzu:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

Docker kann auf Plattformen mit verschiedenen Architekturen ausgeführt werden. Der folgende Befehl erkennt die Architektur Ihres Servers und fügt die entsprechende Repository-Zeile in die Liste des APT-Paketmanagers ein:

echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

Aktualisieren Sie den Paket-Cache und die Richtlinien und installieren Sie docker-ce (Docker Community Edition):

sudo apt update && apt-cache policy docker-ce && sudo apt install docker-ce

Prüfen Sie abschließend, ob der Docker-Daemon läuft und funktioniert:

sudo systemctl status docker

Schritt 5. Docker-Container starten

Starten wir den Container im privilegierten Modus unter Verwendung der zuvor angegebenen Variablen:

sudo docker run --privileged --security-opt seccomp=unconfined \
  --name mlperf3.0 -td                    \
  -v /dev:/dev                            \
  --device=/dev:/dev                      \
  -e LOG_LEVEL_ALL=6                      \
  -v /sys/kernel/debug:/sys/kernel/debug  \
  -v /tmp:/tmp                            \
  -v $MLPERF_DIR:/root/MLPERF             \
  -v $SCRATCH_DIR:/root/scratch           \
  -v $DATASETS_DIR:/root/datasets/        \
  --cap-add=sys_nice --cap-add=SYS_PTRACE \
  --user root --workdir=/root --net=host  \
  --ulimit memlock=-1:-1 $MLPERF_DOCKER_IMAGE

Der Einfachheit halber können Sie über SSH auf das Terminal innerhalb des Containers zugreifen:

sudo docker exec mlperf3.0 bash -c "service ssh start"

Um eine Befehlsshell (bash) in der aktuellen Sitzung zu öffnen, führen Sie den folgenden Befehl aus:

sudo docker exec -it mlperf3.0 bash

Schritt 6. Vorbereiten eines Datensatzes

Um Bert-Implementierungstests mit MLperf durchzuführen, benötigen Sie einen vorbereiteten Datensatz. Die optimale Methode ist die Erzeugung eines Datensatzes aus vorgeladenen Daten. Das MLperf-Repository enthält ein spezielles Skript, prepare_data.sh, das eine bestimmte Anzahl von Paketen benötigt, um zu funktionieren. Wechseln wir in das folgende Verzeichnis:

cd /root/MLPERF/Habana/benchmarks/bert/implementations/PyTorch

Installieren Sie alle erforderlichen Pakete mit Hilfe der vorbereiteten Liste und dem pip-Paketmanager:

pip install -r requirements.txt

Setzen Sie die Variable PYTORCH_BERT_DATA, um dem Skript mitzuteilen, wo es Daten speichern soll:

export PYTORCH_BERT_DATA=/root/datasets/pytorch_bert

Führen Sie das Skript aus:

bash input_preprocessing/prepare_data.sh -o $PYTORCH_BERT_DATA

Das Generierungsverfahren ist recht langwierig und kann mehrere Stunden dauern. Bitte haben Sie Geduld und unterbrechen Sie den Vorgang nicht. Wenn Sie vorhaben, die SSH-Sitzung zu beenden, empfiehlt es sich, das Bildschirmdienstprogramm unmittelbar vor dem Start des Docker-Containers zu verwenden.

Schritt 7. Packen des Datensatzes

Der nächste Schritt besteht darin, den Datensatz für den anschließenden Start von MLperf in gleiche Teile zu "schneiden". Erstellen wir ein separates Verzeichnis für die gepackten Daten:

mkdir $PYTORCH_BERT_DATA/packed

Führen Sie das Packing-Skript aus:

python3 pack_pretraining_data_pytorch.py \
  --input_dir=$PYTORCH_BERT_DATA/hdf5/training-4320/hdf5_4320_shards_uncompressed \
  --output_dir=$PYTORCH_BERT_DATA/packed \
  --max_predictions_per_seq=76

Schritt 8. Einen Test durchführen

Nun, da der Datensatz vorbereitet ist, ist es an der Zeit, den Test durchzuführen. Dies ist jedoch ohne vorherige Vorbereitung nicht möglich. Die Autoren des Bert-Tests haben einige fest kodierte Werte im Skript hinterlassen, die die Ausführung des Tests beeinträchtigen werden. Benennen Sie zunächst das folgende Verzeichnis um:

mv $PYTORCH_BERT_DATA/packed $PYTORCH_BERT_DATA/packed_data_500_pt

Ändern Sie das Verzeichnis:

cd /root/MLPERF/Habana/benchmarks/bert/implementations/HLS-Gaudi2-PT

Da der GNU Nano-Editor nicht im Container installiert ist, muss er separat installiert werden. Alternativ können Sie auch den eingebauten Vi-Editor verwenden:

apt update && apt -y install nano

Bearbeiten Sie nun das Teststartskript:

nano launch_bert_pytorch.sh

Suchen Sie die erste Zeile:

DATA_ROOT=/mnt/weka/data/pytorch/bert_mlperf/packed_data

Ersetzen Sie sie durch die folgende:

DATA_ROOT=/root/datasets/pytorch_bert

Suchen Sie die zweite Zeile:

INPUT_DIR=$DATA_ROOT/packed

Ersetzen Sie sie durch die folgende:

INPUT_DIR=$DATA_ROOT/packed_data_500_pt

Speichern Sie die Datei und beenden Sie sie.

Der Testcode enthält eine Begrenzerfunktion, die den Gradienten daran hindert, bestimmte Werte zu überschreiten, um ein mögliches exponentielles Wachstum zu verhindern. Aus uns unbekannten Gründen fehlt diese Funktion in der im Container verwendeten PyTorch-Version, was dazu führt, dass der Test während der Aufwärmphase abnormal beendet wird.

Eine mögliche Abhilfe könnte darin bestehen, diese Funktion vorübergehend aus dem Code in der Datei fastddp.py zu entfernen. Dazu öffnen Sie die Datei:

nano ../PyTorch/fastddp.py

Suchen Sie die folgenden drei Codezeilen und kommentieren Sie sie mit dem Symbol # (shebang) aus, so dass sie wie folgt aussehen:

#from habana_frameworks.torch import _hpex_C
#    clip_global_grad_norm = _hpex_C.fused_lamb_norm(grads, 1.0)
#    _fusion_buffer.div_((clip_global_grad_norm * _all_reduce_group_size).to(_fusion_buffer.dtype))

Speichern Sie außerdem die Datei und beenden Sie sie. Wechseln Sie das Verzeichnis:

cd ../HLS-Gaudi2-PT

Führen Sie schließlich das Skript aus. Die Ausführung wird etwa 20 Minuten dauern:

./launch_bert_pytorch.sh

Siehe auch:



Aktualisiert: 12.08.2025

Veröffentlicht: 23.01.2025