Construction de l'environnement PyTorch C ++ (LibTorch)

** PyTorch, un type de framework Deep Learning, a une version C ++ ainsi qu'une version Python! ** **

Cette fois, j'expliquerai la marche à suivre pour construire un environnement sur Ubuntu avec "PyTorch C ++" ou "LibTorch". Pour ceux qui aiment le Deep Learning, ceux dont le langage principal est le C ++, et ceux qui travaillent avec des systèmes embarqués, c'est peut-être une solution! De plus, même les personnes qui n'ont jamais utilisé C ++ devraient pouvoir le comprendre dans une certaine mesure.

Tout d'abord, j'expliquerai la procédure de création et d'exécution d'un code source simple, puis j'expliquerai la procédure d'exécution en utilisant le code source réel (code source que j'ai écrit). ** Le code source que j'ai écrit est téléchargé sur GitHub ci-dessous! </ font> ** https://github.com/koba-jon/pytorch_cpp

Ensuite, j'expliquerai la procédure spécifique.

Préparation préalable

--Obligatoire --Installation d'Ubuntu (18.04, 20.04)

--Lors de l'utilisation du GPU --Installation du pilote NVIDIA ([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% UN B))) --Installation de 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)) --Installez 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))

Télécharger LibTorch

Officiel PyTorch: https://pytorch.org/ Accédez au lien et suivez les étapes ci-dessous pour télécharger LibTorch.

libtorch1.png

  • PyTorchBuild
    Sélectionnez ** "Stable" ** si vous souhaitez utiliser la version stable, ** "Preview" ** si vous souhaitez utiliser la dernière version
  • Your OS
    Puisque nous utilisons Ubuntu cette fois, sélectionnez ** "Linux" **
  • Package
    Puisque LibTorch sera utilisé cette fois, sélectionnez ** "LibTorch" **
  • Language
    Puisque C ++ est utilisé cette fois, sélectionnez ** "C ++ / Java" **
  • CUDA
    Sélectionnez ** "Nom de la version" ** si vous utilisez un GPU, ** "Aucun" ** si vous ne l'utilisez pas
  • Run this Command
    Puisque le compilateur C ++ 11 ou supérieur est utilisé, sélectionnez ** "Télécharger ici (cxx11 ABI)" **

Ceci termine le téléchargement de LibTorch lui-même. Il est recommandé de placer le répertoire lui-même dans un emplacement facile à comprendre (tel que directement sous le répertoire personnel).

Contrôle de fonctionnement

Tout d'abord, créez un ** code source temporaire **.

$ mkdir libtorch_test
$ cd libtorch_test
$ vi main.cpp

Ajoutez le code suivant et enregistrez-le. Il s'agit d'un programme qui crée une matrice 3x3 (tenseur du second ordre) avec l'élément de type Float 1.5 et l'affiche sur l'écran de la console.

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;
}

Cette fois, nous utiliserons "Makefile" pour construire facilement le code source. Créez également "CMakeLists.txt" pour créer le "Makefile".

$ vi CMakeLists.txt

Le CMakeLists.txt le plus simple est: ** Copiez et enregistrez ** ceci.

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)

En bref, la première ligne est "spécifier la version de cmake", la suivante est "spécifier le nom du projet et le compilateur C ++", la suivante est "spécifier la bibliothèque à rechercher", la suivante est "spécifier le fichier à compiler", et la suivante Cela signifie "spécifier la bibliothèque" et enfin "spécifier la version du compilateur C ++".

Ensuite, créez un répertoire de construction et exécutez cmake. Ici, ** entrez le chemin du répertoire libtorch que vous avez téléchargé précédemment ** ensemble. (Lorsque "~ / libtorch" est directement sous le répertoire personnel)

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

Cela créera un Makefile, alors lancez make pour le construire.

$ make

Enfin, exécutez le fichier exécutable.

$ ./test

Si ce qui suit est affiché, cela réussit.

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

** La construction de l'environnement de LibTorch lui-même est maintenant terminée </ font> **! Après cela, installez la bibliothèque dépendante et définissez-la pour que l'exemple de code puisse être exécuté.

Installation de bibliothèques dépendantes

OpenCV

OpenCV est utilisé pour ** l'entrée / la sortie de données d'image **.

La méthode d'installation était très simple à comprendre dans cet article. Comme il a été implémenté sur la base de la classe cv :: Mat, veuillez installer ** version 3.0.0 ou supérieure </ font> **.

Boost

Boost est utilisé pour ** obtenir des arguments de ligne de commande et des noms de fichiers **.

Exécutez la commande suivante pour l'installer.

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

Gnuplot

Gnuplot est utilisé pour ** pour dessiner un graphique de perte **.

Exécutez la commande suivante pour l'installer.

$ sudo apt install gnuplot

libpng

libpng est utilisé pour ** lire les images de couleur d'index pour la segmentation sémantique **.

Exécutez la commande suivante pour l'installer.

$ sudo apt install libpng++-dev

Exécution d'un exemple de code

Tout d'abord, exécutez la commande suivante pour cloner l'exemple de code.

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

Réglage du chemin

Editez "CMakeLists.txt" pour définir le chemin de LibTorch.

$ vi utils/CMakeLists.txt

Auparavant, j'ai ajouté "-DCMAKE_PREFIX_PATH = ~ / libtorch" à l'argument de cmake et je l'ai exécuté, mais il est difficile de le saisir à chaque fois. Par conséquent, intégrez le chemin directement dans "CMakeLists.txt".

** Définissez le chemin ** du répertoire "libtorch" où vous avez téléchargé "$ ENV {HOME} / libtorch" ** sur la 4ème ligne. ** S'il y a "libtorch" directement sous votre répertoire personnel, vous n'avez pas besoin de le changer. </ font> **

CMakeLists.txt


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

Cela trouvera automatiquement le fichier libtorch lorsque vous le construirez. Au fait, mon exemple de code cmake est un ensemble de "CMakeLists.txt" de "utils" et de "CMakeLists.txt" de chaque répertoire de modèle. (Cet article était très facile à comprendre comment utiliser cmake.)

Construire

Cette fois, je vais utiliser l'encodeur automatique de convolution, alors déplacez-vous vers ce répertoire. Générez le code source en exécutant la commande suivante.

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

Paramètres de l'ensemble de données

Cette fois, nous utiliserons les données d'image du visage de "Celeb A". Accédez au site suivant et cliquez sur ** "Téléchargements> Images In-The-Wild-> Img-> img_align_celeba.zip" ** pour télécharger. http://mmlab.ie.cuhk.edu.hk/projects/CelebA.html

De plus, je souhaite diviser l'ensemble de données d'origine en données d'entraînement et en données de test, alors définissez-le. Tout d'abord, appliquez ** \ <dataset_path> au "chemin du jeu de données celebA téléchargé" </ font> ** et exécutez la commande suivante.

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

Exécutez ensuite la commande suivante pour séparer les données en formation et test. (Par défaut, "Formation: Test = 9: 1")

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

Formation modèle

Créez un fichier pour la formation.

$ vi scripts/train.sh

** Vous pouvez sélectionner le nombre d'époques avec les époques, la taille de l'image avec la taille, le numéro de GPU utilisé avec gpu_id (passe automatiquement en mode CPU s'il n'y a pas de GPU) et le nombre de canaux d'image ** avec nc. (Pour les autres options, ajoutez "--help" à l'argument ou consultez "main.cpp".)

Puisqu'il s'agit d'un exemple de test de code, modifions ** "epochs" en "1" et "size" en "64" **. En passant, ce paramètre est exactement le même, sauf pour la fonction de perte par rapport au paramètre d'entraînement écrit dans cet article.

train.sh


#!/bin/bash

DATA='celebA'

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

Exécutez la commande suivante pour démarrer l'entraînement.

$ sh scripts/train.sh

L'étape intermédiaire de la formation est comme ça. libtorch2.png

Si la valeur de la perte ne diminue pas, c'est un problème, mais sinon, je pense qu'il n'y a pas de problème particulier.

Test de modèle

Définissez le fichier pour le test.

$ vi scripts/test.sh

Cette fois, nous testons l'exemple de code, changeons donc ** "size" en "64" **. De plus, en définissant "test_in_dir" sur l'image d'entrée et "test_out_dir" sur le chemin Ground Truth de l'image de sortie, il peut être utilisé pour l'évaluation des performances du débruitage, mais cette fois nous ne le changerons pas.

test.sh


#!/bin/bash

DATA='celebA'

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

Exécutez la commande suivante pour démarrer le test.

$ sh scripts/test.sh

C'est un état du test. La perte à gauche est l'erreur entre l'image de sortie et l'image d'entrée, et la perte à droite est l'erreur entre l'image de sortie et son Ground Truth. libtorch3.png Enfin, la perte moyenne sort et c'est fini. libtorch4.png

Publication du code source

** Le code source de cette heure est disponible sur GitHub ci-dessous! !! !! </ font> ** https://github.com/koba-jon/pytorch_cpp

J'ai écrit non seulement un encodeur automatique mais aussi ** VAE, U-Net, pix2pix **, alors essayez-le! Si vous avez des conseils ou des suggestions de corrections, n'hésitez pas à commenter!

De plus, nous avons implémenté des outils utiles pour le débogage, comme indiqué dans le graphique des pertes ci-dessous, alors profitez-en! (Il est créé dans le répertoire "checkpoints" ajouté lors de la formation.) libtorch6.png

À propos, le déroulement de ce processus est le suivant.

libtorch5.png

en conclusion

Cette fois, j'ai construit l'environnement de PyTorch C ++ (LibTorch) sur Ubuntu. Nous espérons qu'il sera utile aux développeurs, aux chercheurs et à toute personne intéressée et étudiée par le Deep Learning.

Merci d'avoir lu l'article jusqu'au bout! Let's have a good development and research life!

Recommended Posts