[PYTHON] Verfahren zum Erlernen und Ableiten eines Transformator-Englisch-Japanisch-Übersetzungsmodells mit CloudTPU

Offizielles Tutorial Beachten Sie, dass es nicht funktioniert hat, wenn ich gemäß der Straße vorgegangen bin. In diesem Artikel wird das Verfahren zum Starten einer CloudTPU- und GCE-VM-Instanz und zum Erstellen eines englisch-japanischen Übersetzungsmodells mit Transformator erläutert, das eines der NMT-Modelle ist.

Annahme

Cloud Console Geben Sie Folgendes in die Cloud-Konsole ein, um eine neue Cloud-TPU- und GCE-VM-Instanz zu starten.

cloud_console


#Satz von Projekt-IDs
gcloud config set project <project_id>
#Starten Sie ctpu(Der Name der CPU ist Transformator)
#Starten Sie auch eine GCE-Instanz
ctpu up --name=transformer --tf-version=1.14

Im offiziellen Tutorial soll es mit "ctpu up" beginnen. Da die Version jedoch nicht mit dem Standard-Tensorflow der GCE VM-Instanz übereinstimmt, tritt ein Fehler auf, wenn Sie gemäß dem Tutorial fortfahren. Die CloudTPU-Version "tensorflow" muss mit der der GCE VM-Instanz übereinstimmen, um dem Lernprogramm zu folgen.

GCE(Google Computing Engine) Wir erklären das Verfahren zum Lernen und Ableiten mit dem Transformatormodell basierend auf Ihrem eigenen Datensatz (zweisprachige englisch-japanische Übersetzung), der in GCS (Google Cloud Strage) gespeichert ist. Im Folgenden werden wir mit der SSH-Verbindung zu der mit "ctpu up" erstellten GCE VM-Instanz fortfahren.

Verzeichnisstruktur in der VM-Instanz

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

Laden Sie den Trainingsdatensatz von GCS auf GCE herunter

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

Hier ist sample.pickle ein zweispaltiger Datenrahmen, der aus Englisch (Englisch) und Japanisch (Japanisch) besteht.

Definition von PROBLEM

Wenn Sie Ihren eigenen Datensatz verwenden möchten, müssen Sie "PROBME" implementieren und registrieren. Referenz: https://tensorflow.github.io/tensor2tensor/new_problem.html Erstellen Sie hier die folgenden zwei Python-Skripte.

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

Legen Sie Umgebungsvariablen in der VM-Instanz fest

#Satz von Umgebungsvariablen
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
#Selbst erstelltes Skript
export USR_DIR=./src

Vorverarbeitung und Lernen

Nach der Vorverarbeitung basierend auf Ihrem eigenen . / Src / myproblem.py lernen Sie. Hier gibt cloud_tpu_name direkt den in ctpu up angegebenen Namen an. (Wenn Sie es mit $ TPU_NAME angeben, tritt ein Fehler auf.) Referenz: https://stackoverflow.com/questions/59089613/tpu-core-error-on-google-cloud-platform-cannot-find-any-tpu-cores-in-the-system

Je nach Datenmenge dauerte ein Datensatz mit ca. 60.000 Übersetzungen ca. 3 Stunden.

#Vorverarbeitung
t2t-datagen \
  --problem=$PROBLEM \
  --data_dir=$DATA_DIR \
  --tmp_dir=$TMP_DIR \
  --t2t_usr_dir=$USR_DIR

#Lernen
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

Inferenz

Führen Sie nach dem Lernen eine Schlussfolgerung durch. Sie können Übersetzungen in einer interaktiven Shell durchführen, indem Sie den Parameter decode_interactive auf True setzen. _ Wenn Sie basierend auf dem Lernergebnis von CloudTPU lokal schließen möchten, lesen Sie bitte Folgendes. _ https://qiita.com/yolo_kiyoshi/items/209750f27f582ed48257

#Inferenz
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

Referenz

Recommended Posts

Verfahren zum Erlernen und Ableiten eines Transformator-Englisch-Japanisch-Übersetzungsmodells mit CloudTPU
MVC-Model Edition, um nur mit Voreingenommenheit von 0 zu lernen
So führen Sie ein geschultes Transformatormodell lokal auf CloudTPU aus
Schritte zur Entwicklung von Django mit VSCode
Lernen Sie mit Chainer, monochrome Bilder einzufärben
Infer Custom Vision Modell mit Raspeye
Vorbereitung auf das Erlernen technischer Indikatoren mit TFlearn