[LINUX] Aufbau einer PyTorch C ++ (LibTorch) -Umgebung

** PyTorch, eine Art Deep Learning-Framework, hat sowohl eine C ++ - als auch eine Python-Version! ** ** **

Dieses Mal werde ich das Verfahren zum Erstellen einer Umgebung unter Ubuntu mit "PyTorch C ++" oder "LibTorch" erläutern. Für diejenigen, die Deep Learning mögen, deren Hauptsprache C ++ ist und die mit eingebetteten Systemen arbeiten, ist dies möglicherweise ein einmaliger Weg! Auch Leute, die C ++ noch nie benutzt haben, sollten es bis zu einem gewissen Grad verstehen können.

Zuerst erkläre ich das Verfahren zum Erstellen und Ausführen eines einfachen Quellcodes und dann das Verfahren zum Ausführen unter Verwendung des tatsächlichen Quellcodes (Quellcode, den ich geschrieben habe). ** Der von mir geschriebene Quellcode wird unten auf GitHub hochgeladen! </ font> ** https://github.com/koba-jon/pytorch_cpp

Dann werde ich das spezifische Verfahren erklären.

Vorbereitungen

--Erforderlich --Installation von Ubuntu (18.04, 20.04)

  • Bei Verwendung einer GPU --Installation des NVIDIA-Treibers ([18.04](https://qiita.com/koba-jon/items/a7c5239fb5c05172c1b3#1-nvidia%E3%83%89%E3%83%A9%E3%82%A4%E3% ") 83% 90% E3% 83% BC% E3% 81% AE% E3% 82% A4% E3% 83% B3% E3% 82% B9% E3% 83% 88% E3% 83% BC% E3% 83% AB))) --Installieren von CUDA ([18.04](https://qiita.com/koba-jon/items/a7c5239fb5c05172c1b3#2-cuda%E3%81%AE%E3%82%A4%E3%83%B3%E3%82] % B9% E3% 83% 88% E3% 83% BC% E3% 83% AB)) --Installation von cuDNN ([18.04](https://qiita.com/koba-jon/items/a7c5239fb5c05172c1b3#3-cudnn%E3%81%AE%E3%82%A4%E3%83%B3%E3%82] % B9% E3% 83% 88% E3% 83% BC% E3% 83% AB))

Laden Sie LibTorch herunter

PyTorch Official: https://pytorch.org/ Greifen Sie auf den Link zu und führen Sie die folgenden Schritte aus, um LibTorch herunterzuladen.

libtorch1.png

  • PyTorchBuild
    Wählen Sie ** "Stabil" **, wenn Sie die stabile Version verwenden möchten, ** "Vorschau" **, wenn Sie die neueste Version verwenden möchten
  • Your OS
    Da wir diesmal Ubuntu verwenden, wählen Sie ** "Linux" **
  • Package
    Da diesmal LibTorch verwendet wird, wählen Sie ** "LibTorch" **
  • Language
    Da diesmal C ++ verwendet wird, wählen Sie ** "C ++ / Java" **
  • CUDA
    Wählen Sie ** "Versionsname" **, wenn Sie eine GPU verwenden, ** "Keine" **, wenn Sie diese nicht verwenden
  • Run this Command
    Da der Compiler C ++ 11 oder höher verwendet wird, wählen Sie ** "Hier herunterladen (cxx11 ABI)" **

Damit ist der Download von LibTorch selbst abgeschlossen. Es wird empfohlen, das Verzeichnis selbst an einem leicht verständlichen Ort abzulegen (z. B. direkt unter dem Ausgangsverzeichnis).

Funktionsprüfung

Erstellen Sie zunächst einen ** temporären Quellcode **.

$ mkdir libtorch_test
$ cd libtorch_test
$ vi main.cpp

Fügen Sie den folgenden Code hinzu und speichern Sie ihn. Dies ist ein Programm, das eine 3x3-Matrix (Tensor zweiter Ordnung) mit dem Float-Element 1.5 erstellt und auf dem Konsolenbildschirm anzeigt.

main.cpp


#include <iostream>
#include <torch/torch.h>

int main(void){
    torch::Tensor x = torch::full({3, 3}, 1.5, torch::TensorOptions().dtype(torch::kFloat));
    std::cout << x << std::endl;
    return 0;
}

Dieses Mal werden wir "Makefile" verwenden, um den Quellcode einfach zu erstellen. Erstellen Sie außerdem "CMakeLists.txt", um das "Makefile" zu erstellen.

$ vi CMakeLists.txt

Die einfachste CMakeLists.txt ist: ** Kopieren und speichern ** Sie dies.

CMakeLists.txt


cmake_minimum_required(VERSION 3.0 FATAL_ERROR)

# Project Name
project(test CXX)

# Find Package
find_package(Torch REQUIRED)

# Create Executable File
add_executable(${PROJECT_NAME} main.cpp)
target_link_libraries(${PROJECT_NAME} ${TORCH_LIBRARIES})
set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_STANDARD 17)

Um es kurz zu erklären, lautet die erste Zeile "Geben Sie die Version von cmake an", die nächste "Geben Sie den Projektnamen und den C ++ - Compiler an", die nächste "Geben Sie die zu durchsuchende Bibliothek an", die nächste "Geben Sie die zu kompilierende Datei an" an und die nächste Es bedeutet "Geben Sie die Bibliothek an" und schließlich "Geben Sie die Version des C ++ - Compilers an".

Erstellen Sie als Nächstes ein Build-Verzeichnis und führen Sie cmake aus. Geben Sie hier ** den Pfad des zuvor heruntergeladenen Libtorch-Verzeichnisses ** zusammen ein. (Wenn sich "~ / libtorch" direkt unter dem Home-Verzeichnis befindet)

$ mkdir build
$ cd build
$ cmake .. -DCMAKE_PREFIX_PATH=~/libtorch

Dadurch wird ein Makefile erstellt. Führen Sie also make aus, um es zu erstellen.

$ make

Führen Sie abschließend die ausführbare Datei aus.

$ ./test

Wenn Folgendes angezeigt wird, ist dies erfolgreich.

 1.5000  1.5000  1.5000
 1.5000  1.5000  1.5000
 1.5000  1.5000  1.5000
[ CPUFloatType{3,3} ]

** LibTorchs eigene Umgebungskonstruktion ist jetzt abgeschlossen </ font> **! Installieren Sie danach die abhängige Bibliothek und stellen Sie sie so ein, dass der Beispielcode ausgeführt werden kann.

Installation abhängiger Bibliotheken

OpenCV

OpenCV wird für die ** Eingabe / Ausgabe von Bilddaten ** verwendet.

Die Installationsmethode war in diesem Artikel sehr einfach zu verstehen. Da es basierend auf der cv :: Mat-Klasse implementiert wurde, installieren Sie bitte ** Version 3.0.0 oder höher </ font> **.

Boost

Boost wird verwendet, um ** Befehlszeilenargumente und Dateinamen abzurufen **.

Führen Sie den folgenden Befehl aus, um es zu installieren.

$ sudo apt install libboost-dev libboost-all-dev

Gnuplot

Gnuplot wird für ** verwendet, um ein Diagramm des Verlusts zu zeichnen **.

Führen Sie den folgenden Befehl aus, um es zu installieren.

$ sudo apt install gnuplot

libpng

libpng wird für ** verwendet, um Indexfarbbilder für die semantische Segmentierung zu lesen **.

Führen Sie den folgenden Befehl aus, um es zu installieren.

$ sudo apt install libpng++-dev

Beispielcode ausführen

Führen Sie zunächst den folgenden Befehl aus, um den Beispielcode zu klonen.

$ cd ~
$ git clone https://github.com/koba-jon/pytorch_cpp.git
$ cd pytorch_cpp

Pfadeinstellung

Bearbeiten Sie "CMakeLists.txt", um den Pfad von LibTorch festzulegen.

$ vi utils/CMakeLists.txt

Früher habe ich dem Argument von cmake "-DCMAKE_PREFIX_PATH = ~ / libtorch" hinzugefügt und es ausgeführt, aber es ist mühsam, dies jedes Mal einzugeben. Betten Sie den Pfad daher direkt in "CMakeLists.txt" ein.

** Legen Sie in der 4. Zeile den Pfad ** des Verzeichnisses "libtorch" fest, in das Sie "$ ENV {HOME} / libtorch" ** heruntergeladen haben. ** Wenn sich "libtorch" direkt unter Ihrem Home-Verzeichnis befindet, müssen Sie es nicht ändern. </ font> **

CMakeLists.txt


3: # LibTorch
4: set(LIBTORCH_DIR $ENV{HOME}/libtorch)
5: list(APPEND CMAKE_PREFIX_PATH ${LIBTORCH_DIR})

Dadurch wird die libtorch-Datei beim Erstellen automatisch gefunden. Mein Beispielcode cmake besteht übrigens aus "CMakeLists.txt" von "utils" und "CMakeLists.txt" jedes Modellverzeichnisses. (Dieser Artikel war sehr einfach zu verstehen, wie man cmake verwendet.)

Bauen

Dieses Mal werde ich den automatischen Faltungscodierer verwenden, also gehe in dieses Verzeichnis. Erstellen Sie den Quellcode, indem Sie den folgenden Befehl ausführen.

$ cd AE2d
$ mkdir build
$ cd build
$ cmake ..
$ make -j4
$ cd ..

Datensatzeinstellungen

Dieses Mal werden wir die Gesichtsbilddaten von "Celeb A" verwenden. Greifen Sie auf die folgende Site zu und klicken Sie zum Herunterladen auf ** "Downloads> In-The-Wild Images-> Img-> img_align_celeba.zip" **. http://mmlab.ie.cuhk.edu.hk/projects/CelebA.html

Außerdem möchte ich den Originaldatensatz in Trainingsdaten und Testdaten aufteilen. Wenden Sie zunächst ** \ <dataset_path> auf den "Pfad des heruntergeladenen celebA-Datasets" </ font> ** an und führen Sie den folgenden Befehl aus.

$ cd datasets
$ ln -s <dataset_path> ./celebA_org

Führen Sie dann den folgenden Befehl aus, um die Daten in Training und Test zu unterteilen. (Standardmäßig "Training: Test = 9: 1")

$ sudo apt install python3 python3-pip
$ pip3 install natsort
$ sh hold_out.sh
$ mv ./celebA/valid ./celebA/test
$ cd ..

Modelltraining

Richten Sie eine Datei für das Training ein.

$ vi scripts/train.sh

** Sie können die Anzahl der Epochen mit Epochen, die Bildgröße mit der Größe, die mit gpu_id verwendete GPU-Nummer (wechselt automatisch in den CPU-Modus, wenn keine GPU vorhanden ist) und die Anzahl der Bildkanäle ** mit nc auswählen. (Für andere Optionen fügen Sie dem Argument "--help" hinzu oder lesen Sie "main.cpp".)

Da dies ein Beispielcode-Test ist, ändern wir ** "Epochen" in "1" und "Größe" in "64" **. Übrigens ist diese Einstellung bis auf die Verlustfunktion im Vergleich zu der in diesem Artikel beschriebenen Trainingseinstellung genau dieselbe.

train.sh


#!/bin/bash

DATA='celebA'

./AE2d \
    --train true \
    --epochs 300 \ #Wechseln Sie zu 1
    --dataset ${DATA} \
    --size 256 \ #Wechseln Sie zu 64
    --batch_size 16 \
    --gpu_id 0 \
    --nc 3

Führen Sie den folgenden Befehl aus, um das Training zu starten.

$ sh scripts/train.sh

Die mittlere Ausbildungsstufe ist so. libtorch2.png

Wenn der Verlustwert nicht abnimmt, ist dies ein Problem, aber wenn nicht, gibt es meines Erachtens kein besonderes Problem.

Modellprüfung

Stellen Sie die Datei für den Test ein.

$ vi scripts/test.sh

Dieses Mal testen wir den Beispielcode, also ändern wir ** "Größe" in "64" **. Durch Setzen von "test_in_dir" auf das Eingabebild und "test_out_dir" auf den Ground Truth-Pfad des Ausgabebilds kann es auch zur Leistungsbewertung des Entrauschens verwendet werden, diesmal wird es jedoch nicht geändert.

test.sh


#!/bin/bash

DATA='celebA'

./AE2d \
    --test true \
    --dataset ${DATA} \
    --test_in_dir "test" \
    --test_out_dir "test" \
    --size 256 \ #Wechseln Sie zu 64
    --gpu_id 0 \
    --nc 3

Führen Sie den folgenden Befehl aus, um den Test zu starten.

$ sh scripts/test.sh

Es ist ein Stand des Tests. Der Verlust links ist der Fehler zwischen dem Ausgabebild und dem Eingabebild, und der Verlust rechts ist der Fehler zwischen dem Ausgabebild und seiner Grundwahrheit. libtorch3.png Schließlich kommt der durchschnittliche Verlust heraus und es ist vorbei. libtorch4.png

Veröffentlichung des Quellcodes

** Der Quellcode für diese Zeit ist unten auf GitHub verfügbar! !! !! </ font> ** https://github.com/koba-jon/pytorch_cpp

Ich habe nicht nur Auto Encoder geschrieben, sondern auch ** VAE, U-Net, pix2pix **, also probieren Sie es bitte aus! Wenn Sie Ratschläge oder Vorschläge für Korrekturen haben, können Sie diese gerne kommentieren!

Darüber hinaus haben wir Tools implementiert, die für das Debuggen nützlich sind, wie in der Verlustgrafik unten gezeigt. Nutzen Sie diese also bitte! (Es wird in dem Verzeichnis "Checkpoints" erstellt, das während des Trainings hinzugefügt wurde.) libtorch6.png

Der Ablauf dieses Prozesses ist übrigens wie folgt.

libtorch5.png

abschließend

Dieses Mal habe ich die Umgebung von PyTorch C ++ (LibTorch) unter Ubuntu erstellt. Wir hoffen, dass es Entwicklern, Forschern und allen, die sich für Deep Learning interessieren und es studieren, nützlich sein wird.

Vielen Dank, dass Sie den Artikel bis zum Ende gelesen haben! Let's have a good development and research life!

Recommended Posts