Co-auteur de l'article: Mike Cheng
La plate-forme Google Cloud possède désormais des images de machines virtuelles dans son portefeuille, conçues spécifiquement pour les personnes impliquées dans le Deep Learning. Aujourd'hui, nous allons parler de ce que ces images représentent, des avantages qu'elles procurent aux développeurs et aux chercheurs et, bien sûr, comment créer une machine virtuelle à partir de ces images.
Digression lyrique: au moment de la rédaction du présent document, le produit était toujours en version bêta, respectivement, aucun SLA ne lui était applicable.
Quel genre de bête est-ce, des images de machines virtuelles pour le Deep Learning de Google?
Les images de machine virtuelle pour le Deep Learning de Google sont des images Debian 9 qui, dès la sortie de l'emballage, contiennent tout ce dont le Deep Learning a besoin. Actuellement, il existe des versions d'images avec TensorFlow, PyTorch et des images à usage général. Chaque version existe dans l'édition pour les instances uniquement CPU et GPU. Afin de mieux comprendre de quelle image vous avez besoin, j'ai dessiné une petite feuille de triche:

Comme indiqué sur la feuille de triche, il existe 8 familles d'images différentes. Comme déjà mentionné, ils sont tous basés sur Debian 9.
Qu'est-ce qui est préinstallé exactement sur les images?
Toutes les images ont Python 2.7 / 3.5 avec les packages pré-installés suivants:
- engourdi
- sklearn
- scipy
- pandas
- nltk
- oreiller
- Environnements Jupyter (Lab et Notebook)
- et bien plus.
Pile configurée depuis Nvidia (uniquement dans les images GPU):
- CUDA 9. *
- CuDNN 7.1
- NCCL 2. *
- dernier pilote nvidia
La liste est constamment mise à jour, alors restez à l'écoute sur la page officielle .
Et pourquoi ces images sont-elles réellement nécessaires?
Disons que vous devez former un modèle de réseau neuronal à l'aide de Keras (avec TensorFlow). La vitesse d'apprentissage est importante pour vous et vous décidez d'utiliser le GPU. Pour utiliser le GPU, vous devrez installer et configurer la pile Nvidia (pilote Nvidia + CUDA + CuDNN + NCCL). Non seulement ce processus est assez compliqué en soi (surtout si vous n'êtes pas un ingénieur système, mais un chercheur), il est également compliqué par le fait que vous devez prendre en compte les dépendances binaires de votre version de la bibliothèque TensorFlow. Par exemple, la distribution officielle de TensorFlow 1.9 est compilée avec CUDA 9.0 et ne fonctionnera pas si vous avez une pile avec CUDA 9.1 ou 9.2 installée. La configuration de cette pile peut être un processus "amusant", je pense que personne ne peut contester cela (en particulier ceux qui l'ont fait).
Supposons maintenant qu'après plusieurs nuits blanches, tout est installé et fonctionne. Question: cette configuration, que vous avez pu configurer, est-elle la plus optimale pour votre matériel? Par exemple, est-il vrai que le CUDA 9.0 installé et le package binaire officiel TensorFlow 1.9 affichent la vitesse la plus rapide sur une instance avec un processeur SkyLake et un GPU Volta V100?
Il est presque impossible de répondre sans tester avec d'autres versions de CUDA. Pour répondre avec certitude, vous devez reconstruire manuellement TensorFlow dans différentes configurations et exécuter vos tests. Tout cela doit être effectué sur ce matériel coûteux, sur lequel il est prévu de former le modèle par la suite. Eh bien, et la toute dernière, toutes ces mesures peuvent être supprimées dès la sortie de la nouvelle version de TensorFlow ou de la pile Nvidia. On peut affirmer en toute sécurité que la plupart des chercheurs ne le feront tout simplement pas et utiliseront simplement l'ensemble TensorFlow standard, n'ayant pas une vitesse optimale.
C'est là que les images de Deep Learning de Google apparaissent sur la scène. Par exemple, les images avec TensorFlow ont leur propre assemblage TensorFlow, qui est optimisé pour le matériel disponible sur Google Cloud Engine. Ils sont testés avec une configuration différente de la pile Nvidia et sont basés sur celle qui a montré les performances les plus élevées (spoiler: ce n'est pas toujours le plus récent). Eh bien et surtout - presque tout ce dont vous avez besoin pour la recherche est déjà préinstallé!
Comment puis-je créer une instance basée sur l'une des images?
Il existe deux options pour créer une nouvelle instance basée sur ces images:
- Utilisation de l'interface utilisateur Web de Google Cloud Marketplace
- Utiliser gcloud
Étant donné que je suis un grand fan du terminal et des utilitaires CLI, dans cet article, je parlerai de cette option. De plus, si vous aimez l'interface utilisateur, il existe une assez bonne documentation décrivant comment créer une instance à l'aide de l'interface utilisateur Web .
Avant de continuer, installez (si vous ne l'avez pas déjà installé) l' outil gcloud. En option, vous pouvez utiliser Google Cloud Shell , mais gardez à l' esprit que la fonction WebPreview dans Google Cloud Shell n'est pas actuellement prise en charge et que vous ne pouvez donc pas y utiliser Jupyter Lab ou Notebook.
L'étape suivante consiste à sélectionner une famille d'images. Je me permettrai une fois de plus d'apporter la feuille de triche avec le choix d'une famille d'images.

Par exemple, nous supposons que votre choix s'est porté sur tf-latest-cu92, et nous l'utiliserons plus tard dans le texte.
Attendez, mais que faire si j'ai besoin d'une version spécifique de TensorFlow, plutôt que de la «dernière»?
Supposons que nous ayons un projet qui nécessite TensorFlow 1.8, mais en même temps 1.9 a déjà été publié et les images de la dernière famille tf ont déjà 1.9. Pour ce cas, nous avons une famille d'images, qui a toujours une version spécifique du cadre (dans notre cas, tf-1-8-cpu et tf-1-8-cu92). Ces familles d'images seront mises à jour, mais la version de TensorFlow n'y changera pas.
Comme il ne s'agit que d'une version bêta, nous ne prenons désormais en charge que TensorFlow 1.8 / 1.9 et PyTorch 0.4. Nous prévoyons de prendre en charge les versions futures, mais nous ne pouvons pas, à ce stade, répondre clairement à la question de la durée de prise en charge des anciennes versions.
Et si je veux créer un cluster ou utiliser la même image?
En effet, il peut y avoir de nombreux cas où il est nécessaire de réutiliser la même image encore et encore (plutôt qu'une famille d'images). À strictement parler, l'utilisation directe d'images est presque toujours l'option préférée. Eh bien, par exemple, si vous exécutez un cluster avec plusieurs instances, il n'est pas recommandé dans ce cas de spécifier des familles d'images directement dans vos scripts, car si la famille est mise à jour au moment où le script s'exécute, il est probable que différentes instances de cluster seront créées à partir d'images différentes (et peut avoir différentes versions de bibliothèques!). Dans de tels cas, il est préférable d'obtenir d'abord un nom spécifique pour l'image de leur famille, et ensuite seulement d'utiliser un nom spécifique.
Si ce sujet vous intéresse, vous pouvez consulter mon article «Comment utiliser correctement les familles d'images».
Vous pouvez afficher le nom de la dernière image de la famille avec une simple commande:
gcloud compute images describe-from-family tf-latest-cu92 \ --project deeplearning-platform-release
Supposons que le nom d'une image particulière soit tf-latest-cu92-1529452792, vous pouvez déjà l'utiliser n'importe où:
Il est temps de créer notre première instance!
Pour créer une instance à partir d'une famille d'images, exécutez simplement une commande simple:
export IMAGE_FAMILY="tf-latest-cu92"
Si vous utilisez le nom de l'image et non la famille d'images, vous devez remplacer «- image-family = $ IMAGE_FAMILY» par «- image = $ IMAGE-NAME».
Si vous utilisez une instance avec un GPU, vous devez faire attention aux circonstances suivantes:
Vous devez sélectionner la bonne zone . Si vous créez une instance avec un GPU spécifique, vous devez vous assurer que ce type de GPU est disponible dans la zone dans laquelle vous créez l'instance. Ici vous pouvez trouver la correspondance des zones avec les types de GPU. Comme vous pouvez le voir, us-west1-b est la seule zone dans laquelle il existe les 3 types de GPU possibles (K80 / P100 / V100).
Assurez-vous que vous disposez de suffisamment de quotas pour créer une instance avec le GPU . Même si vous avez choisi la bonne région, cela ne signifie pas que vous avez un quota pour créer une instance avec un GPU dans cette région. Par défaut, le quota du GPU est défini sur zéro dans toutes les régions, donc toutes les tentatives de création d'une instance avec le GPU échoueront. Une bonne explication sur la façon d'augmenter le quota peut être trouvée ici .
Assurez-vous qu'il y a suffisamment de GPU dans la zone pour satisfaire votre demande . Même si vous avez choisi la bonne région et que vous avez un quota de GPU dans cette région, cela ne signifie pas qu'il existe un GPU qui vous intéresse dans cette zone. Malheureusement, je ne sais pas comment vous pouvez vérifier la disponibilité du GPU, sauf pour tenter de créer une instance et voir ce qui se passe =)
Choisissez le nombre correct de GPU (selon le type de GPU) . Le fait est que l'indicateur «accélérateur» de notre équipe est responsable du type et du nombre de GPU qui seront disponibles pour l'instance: c.-à-d. «- accelerator = 'type = nvidia-tesla-v100, count = 8'» créera une instance avec huit GPU Nvidia Tesla V100 (Volta) disponibles. Chaque type de GPU possède une liste valide de valeurs de comptage. Voici la liste de chaque type de GPU:
- nvidia-tesla-k80, peut avoir des comptes: 1, 2, 4, 8
- nvidia-tesla-p100, peut avoir des comptes: 1, 2, 4
- nvidia-tesla-v100, peut avoir des nombres: 1, 8
Accordez à Google Cloud l'autorisation d'installer le pilote Nvidia en votre nom au moment du lancement de l'instance . Le chauffeur de Nvidia est un must. Pour des raisons dépassant le cadre de cet article, les images n'ont pas de pilote Nvidia préinstallé. Cependant, vous pouvez donner à Google Cloud le droit de l'installer en votre nom la première fois que vous lancez l'instance. Pour ce faire, ajoutez l'indicateur «- metadata = 'install-nvidia-driver = True'». Si vous ne spécifiez pas cet indicateur, la première fois que vous vous connectez via SSH, vous serez invité à installer le pilote.
Malheureusement, le processus d'installation du pilote prend du temps au premier démarrage, car il doit télécharger et installer ce pilote (et cela implique également de redémarrer l'instance). Au total, cela ne devrait pas prendre plus de 5 minutes. Nous parlerons un peu plus tard de la façon dont vous pouvez réduire le premier temps de démarrage.
Se connecter à une instance via SSH
C'est plus simple qu'un navet et peut être fait avec une seule commande:
gcloud compute ssh $INSTANCE_NAME
gcloud va créer une paire de clés et les télécharger automatiquement sur l'instance nouvellement créée, ainsi que créer votre utilisateur dessus. Si vous souhaitez rendre ce processus encore plus simple, vous pouvez également utiliser une fonction qui simplifie cela:
function gssh() { gcloud compute ssh $@ } gssh $INSTANCE_NAME
Au fait, vous pouvez trouver toutes mes fonctions bash de gcloud ici . Eh bien, avant de passer à la question de la vitesse de ces images ou de ce qui peut être fait avec elles, permettez-moi de clarifier le problème de la vitesse de lancement des instances.
Comment puis-je réduire le temps du premier démarrage?
Techniquement, l'heure du tout premier lancement n'est rien. Mais vous pouvez:
- créer l'instance n1-standard-1 la moins chère avec un K80;
- attendez la fin du premier téléchargement;
- vérifiez que le pilote Nvidia est installé (cela peut être fait en exécutant «nvidia-smi»);
- Arrêtez l'instance
- Créez votre propre image à partir d'une instance arrêtée
- Bénéfice - Toutes les instances créées à partir de votre image dérivée auront un temps de lancement légendaire de 15 secondes.
Donc, à partir de cette liste, nous savons déjà comment créer une nouvelle instance et nous y connecter, nous savons également comment vérifier les pilotes pour leur fonctionnement. Il ne reste plus qu'à parler de la façon d'arrêter l'instance et de créer une image à partir de celle-ci.
Pour arrêter l'instance, exécutez la commande suivante:
function ginstance_stop() { gcloud compute instances stop - quiet $@ } ginstance_stop $INSTANCE_NAME
Et voici la commande pour créer l'image:
export IMAGE_NAME="my-awesome-image" export IMAGE_FAMILY="family1" gcloud compute images create $IMAGE_NAME \ --source-disk $INSTANCE_NAME \ --source-disk-zone $ZONE \ --family $IMAGE_FAMILY
Félicitations, vous avez maintenant votre propre image avec les pilotes Nvidia installés.
Et Jupyter Lab?
Une fois que votre instance est en cours d'exécution, la prochaine étape logique serait de démarrer Jupyter Lab pour passer directement aux affaires :) Avec de nouvelles images, c'est très simple. Jupyter Lab fonctionne déjà depuis le lancement de l'instance. Il vous suffit de vous connecter à l'instance et de transmettre le port sur lequel Jupyter Lab écoute. Et c'est le port 8080. Cela se fait avec la commande suivante:
gssh $INSTANCE_NAME -- -L 8080:localhost:8080
Tout est prêt, maintenant vous pouvez simplement ouvrir votre navigateur préféré et aller sur http: // localhost: 8080
Dans quelle mesure TensorFlow est-il plus rapide à partir d'images?
Une question très importante, car la vitesse de formation du modèle est de l'argent réel. Cependant, la réponse complète à cette question sera la plus longue qui est déjà écrite dans cet article. Il faut donc attendre le prochain article :)
En attendant, je vais vous chouchouter avec quelques chiffres obtenus dans ma petite expérience personnelle. Ainsi, la vitesse d'entraînement sur ImageNet était de 6100 images par seconde (réseau ResNet-50). Mon budget personnel ne m'a pas permis de terminer l'entraînement du modèle complètement, cependant, à cette vitesse, je suppose qu'il est possible d'atteindre 75% de précision en 5 heures avec un peu.
Où trouver de l'aide?
Si vous avez besoin d'informations sur de nouvelles images, vous pouvez:
- poser une question sur stackoverflow, avec la balise google-dl-platform;
- écrire au groupe Google public;
- peut m'écrire par mail ou sur twitter .
Vos commentaires sont très importants, si vous avez quelque chose à dire sur les images, n'hésitez pas à me contacter de la manière qui vous convient ou à laisser un commentaire sous cet article.