NNI est une boîte à outils pour l'optimisation des hyper-paramètres afin d'obtenir des réseaux de neurones performants.
Une documentation très complète est disponible (doc).
Cette page Wiki regroupe nos expériences sur l'installation (NNI, Pytorch, Anaconda) et l'exécution (GPU, ssh, interface Web usager) de NNI.
N'HÉSITEZ PAS À COLLABORER AVEC VOS PROPRES EXPÉRIENCES
Une vidéo d'un mini-tutoriel basé sur un premier essai est disponible.
* L'installation requiert Python>=3.6. Il est possible de faire l'installation directement avec git en utilisant le code source de NNI sur Github et en lançant le script d'installation :
git clone -b v1.9 https://github.com/Microsoft/nni.git cd nni ./install.sh
nvidia-smi
; En direct: watch -d -n 0.5 nvidia-smi
export MKL_THREADING_LAYER=GNU
export CUDA_VISIBLE_DEVICES=x,y,z
ssh -L 8080:localhost:8080 [email protected]
.ssh.gerad.ca
: chercher ssh hop tunneling
sur le web.module load anaconda conda activate pytorch-1.6.0
nni/examples/trials/cifar10-pytorch
. On doit modifier le fichier main.py
pour spécifier des valeurs des hyperparamètres. Créons un fichier main_test.py
à partir de main.py
et faisons quelques modifications. On trouve dans le fichier les lignes suivantes :RCV_CONFIG = nni.get_next_parameter() #RCV_CONFIG = {'lr': 0.1, 'optimizer': 'Adam', 'model':'senet18'}
On doit commenter (#) la première ligne et dé-commenter la deuxième. Je recommande aussi de faire un premier test avec un nombre réduit d'epochs. Dans la partie 'main' du script python on remplace le défaut de 200 epochs par 5.
parser.add_argument("--epochs", type=int, default=200)'' ==> ''parser.add_argument("--epochs", type=int, default=5)
python3 main_test.py
on obtient :==> Preparing data.. .. .. ==> Building model.. Epoch: 0
Le script ne fait pas utilisation de GPU (sinon on aurait une mention de CUDA) et on remarque que c'est très long car on utilise le CPU! Nous devons faire 2 commandes supplémentaires pour pouvoir utiliser les GPU avant de relancer le script :
export MKL_THREADING_LAYER=GNU
export CUDA_VISIBLE_DEVICES=x
Pour choisir la valeur de x
, on fait la commande nvidia-smi
pour voir quelles sont les GPU disponibles.
nnictl create –config nni/examples/trials/cifar10-pytorch/config.yml
searchSpacePath: search_space.json
{ "lr":{"_type":"choice", "_value":[0.1, 0.01, 0.001, 0.0001]}, "optimizer":{"_type":"choice", "_value":["SGD", "Adadelta", "Adagrad", "Adam", "Adamax"]}, "model":{"_type":"choice", "_value":["vgg", "resnet18", "googlenet", "densenet121", "mobilenet", "dpn92", "senet18"]} }
python3 main.py
nnictl
dans le shell pour controller les expériences effectuées avec NNI. Parmi les commandes, celles que j'utilise le plus :
nnictl create
pour créer une expérience.
nnictl top
pour voir ce qui se passe dans l'expérience en cours.
nnictl stop
pour arrêter une expérience en cours.
~/nni-experiments
et porte comme nom l'identifiant de l'expérience (id). Cet identifiant est donné lorsque l'on créé un expérience. On peut modifier ce répertoire en rajoutant la ligne suivante dans le fichier config.yml
:logDir: /home/username/mon_repertoire_adore/NNI/nni-experiments
localhost:8080
. Magie, magie, normalement on devrait voir une page Web avec ce qui se passe dans notre expérience.trialConcurrency: x
gpuNum: 1
gpuIndices: 0, 1, 2, 3
.CUDA_VISIBLE_DEVICES
on peut spécifier quelles GPUs utiliser : export CUDA_VISIBLE_DEVICES=0,1,2,3
Quelques petites choses sur l'évaluation avec plusieurs GPUs toujours en définissant correctement la variable d'environnement CUDA_VISIBLE_DEVICES
. Les tests ont été fait sur pandora
.
PyTorch.
J'observe que c'est plus lent avec 2 GPUs qu'avec un seul. Oups!batch size
de 128. On peut changer ce paramètre qui influence la taille des batchs d'images qui sont envoyés vers un GPU. Dans pytorch
on peut modifier comment le trainset
est chargé.
trainset = torchvision.datasets.CIFAR100(root='./data', train=True, download=True, transform=transform_train)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=128, shuffle=True, num_workers=2)