[PYTHON] Procédure d'apprentissage et de déduction d'un modèle de traduction anglais-japonais de transformateur avec CloudTPU

Tutoriel officiel Notez que cela ne fonctionnait pas si je procédais selon la rue. Dans cet article, nous expliquerons la procédure de lancement d'une instance de VM CloudTPU et GCE et de création d'un modèle de traduction anglais-japonais avec transformateur, qui est l'un des modèles NMT.

supposition

Cloud Console Saisissez ce qui suit dans Cloud Console pour lancer une nouvelle instance de VM Cloud TPU et GCE.

cloud_console


#Ensemble d'ID de projet
gcloud config set project <project_id>
#Démarrer ctpu(le nom du ctpu est transformer)
#Lancer également une instance GCE
ctpu up --name=transformer --tf-version=1.14

Dans le didacticiel officiel, il est censé commencer par ctpu up, mais comme la version ne correspond pas au tensorflow par défaut de l'instance de machine virtuelle GCE, si vous procédez selon le didacticiel, une erreur se produira. La version CloudTPU tensorflow doit correspondre à celle de l'instance de VM GCE pour suivre le tutoriel.

GCE(Google Computing Engine) Nous vous expliquerons la procédure d'apprentissage et de déduction avec le modèle de transformateur basé sur votre propre ensemble de données (traduction anglais-japonais) stocké dans GCS (Google Cloud Strage). Ci-dessous, nous allons procéder à la connexion SSH à l'instance de VM GCE créée avec ctpu up.

Structure de répertoire dans l'instance de VM

.
├── src
│   ├── __init__.py
│   └── myproblem.py
└── tmp
    └── t2t_tmp
        └── sample.picke

Télécharger l'ensemble de données de formation de GCS vers GCE

gsutil cp gs://<budge_name>/sample.pickle ./tmp/t2t_tmp/sample.pickle

Ici, «sample.pickle» est un bloc de données à deux colonnes composé de l'anglais (anglais) et du japonais (japonais).

Définition du PROBLÈME

Si vous souhaitez utiliser votre propre ensemble de données, vous devez implémenter et enregistrer PROBME. Référence: https://tensorflow.github.io/tensor2tensor/new_problem.html Ici, créez les deux scripts Python suivants.

python:./src/__init__.py


from . import myproblem

python:./src/myproblem.py


import pickle

import numpy as np

from tensor2tensor.data_generators import problem
from tensor2tensor.data_generators import text_problems
from tensor2tensor.utils import registry


@registry.register_problem
class Translate_JPEN(text_problems.Text2TextProblem):
    @property
    def approx_vocab_size(self):
        return 2**13

    @property
    def is_generate_per_split(self):
        return False

    @property
    def dataset_splits(self):
        return [{
            "split": problem.DatasetSplit.TRAIN,
            "shards": 9,
        }, {
            "split": problem.DatasetSplit.EVAL,
            "shards": 1,
        }]

    def generate_samples(self, data_dir, tmp_dir, dataset_split):
        with open('./tmp/t2t_tmp/sample.pickle', 'rb') as fin:
            sentences = pickle.load(fin)
        for row in np.array(sentences):
            yield {'inputs': row[0], 'targets': row[1]}

Définir des variables d'environnement dans l'instance de VM

#Ensemble de variables d'environnement
export STORAGE_BUCKET=gs://<project_name>
export DATA_DIR=$STORAGE_BUCKET/transformer
export TMP_DIR=/tmp/t2t_tmp
export PATH=.local/bin:$PATH
export PROBLEM=translate_jpen
export TRAIN_DIR=$STORAGE_BUCKET/training/transformer_ende
export MODEL=transformer
export HPARAMS=transformer_tpu
#Script personnalisé
export USR_DIR=./src

Prétraitement et apprentissage

Après un prétraitement basé sur votre propre . / Src / myproblem.py, vous apprendrez. Ici, cloud_tpu_name spécifie directement le nom spécifié dans ctpu up. (Si vous le spécifiez avec «$ TPU_NAME», une erreur se produira.) Référence: https://stackoverflow.com/questions/59089613/tpu-core-error-on-google-cloud-platform-cannot-find-any-tpu-cores-in-the-system

Il a fallu environ 3 heures pour un ensemble de données d'environ 60 000 traductions, selon la quantité de données.

#Prétraitement
t2t-datagen \
  --problem=$PROBLEM \
  --data_dir=$DATA_DIR \
  --tmp_dir=$TMP_DIR \
  --t2t_usr_dir=$USR_DIR

#Apprentissage
t2t-trainer \
  --data_dir=$DATA_DIR \
  --problem=$PROBLEM \
  --train_steps=40000 \
  --eval_steps=3 \
  --model=$MODEL \
  --hparams_set=$HPARAMS \
  --output_dir=$TRAIN_DIR \
  --t2t_usr_dir=$USR_DIR \
  --use_tpu=True \
  --cloud_tpu_name=transformer

inférence

Après avoir appris, effectuez une inférence. Vous pouvez effectuer des traductions dans un shell interactif en définissant le paramètre decode_interactive sur True. _ Si vous souhaitez déduire localement en fonction du résultat d'apprentissage de CloudTPU, veuillez vous reporter à ce qui suit. _ https://qiita.com/yolo_kiyoshi/items/209750f27f582ed48257

#inférence
t2t-decoder \
   --data_dir=$DATA_DIR \
   --problem=$PROBLEM \
   --model=$MODEL \
   --hparams_set=$HPARAMS \
   --output_dir=$TRAIN_DIR \
   --t2t_usr_dir=$USR_DIR \
   --decode_hparams="beam_size=4,alpha=0.6 \
   --decode_interactive=true

référence

Recommended Posts

Procédure d'apprentissage et de déduction d'un modèle de traduction anglais-japonais de transformateur avec CloudTPU
MVC - Édition de modèle pour apprendre de 0 avec un biais uniquement
Comment exécuter un modèle de transformateur entraîné localement sur CloudTPU
Étapes pour développer Django avec VSCode
Apprenez à coloriser les images monochromes avec Chainer
Modèle Infer Custom Vision avec Raspeye
Se préparer à apprendre les indicateurs techniques avec TFlearn