Translate

2017年7月10日月曜日

Tensor2Tensor Transformers の README.md を翻訳してワークフローを動かしはじめた



今日、Twitterに流れてきたリンク

T2T: Tensor2Tensor Transformers
https://github.com/tensorflow/tensor2tensor

で T2T なるOSSがあることを知った。
Google正規プロジェクトモノではないらしいが..

ということで GitHub の README.md を翻訳してみた。
以下、翻訳内容だが、参照の際は at your own risk でお願いします。

-----

T2T: Tensor2Tensor Transformers


T2T はモジュール化された拡張可能なライブラリで、TensorFlowを使用した教師あり学習とSequneceタスクのサポートのためのバイナリです。 Google Brainチーム内の研究者やエンジニアが積極的に使用し維持しています。 Tensor2Tensorについて詳しくは、 最近のGoogle Research Blogの記事 をご覧ください。

私たちはT2Tを拡張する上であなたと協力したいと思っていますので、 GitHubでIssueを開  いたり、プルリクエストを送信してデータセットやモデルを追加してください。 詳細と未解決の問題については、弊社の貢献文書  をご覧ください。 そして、Gitterで我々や他のユーザたちとチャットしてください。



ウォークスルー


ここでは、論文 "Attention Is All You Need" にある WMTデータ上でTransformerモデルを使用して、英語からドイツ語への翻訳モデルをトレーニングするウォークスルーを紹介します。



pip install tensor2tensor

#どの問題、モデル、およびハイパーパラメータセットが利用可能かを確認すること。
#それらの間を簡単に入れ替えることができます(新しいものを追加することも可能)。

t2t-trainer --registry_help

PROBLEM=wmt_ende_tokens_32k
MODEL=transformer
HPARAMS=transformer_base_single_gpu

DATA_DIR=$HOME/t2t_data
TMP_DIR=/tmp/t2t_datagen
TRAIN_DIR=$HOME/t2t_train/$PROBLEM/$MODEL-$HPARAMS

mkdir -p $DATA_DIR $TMP_DIR $TRAIN_DIR

# データ生成
t2t-datagen \
  --data_dir=$DATA_DIR \
  --tmp_dir=$TMP_DIR \
  --num_shards=100 \
  --problem=$PROBLEM

cp $TMP_DIR/tokens.vocab.* $DATA_DIR

# トレーニング
# out of memoryとなる場合は、
# --hparams='batch_size=2048' (もしくは1024)を追加してください。
t2t-trainer \
  --data_dir=$DATA_DIR \
  --problems=$PROBLEM \
  --model=$MODEL \
  --hparams_set=$HPARAMS \
  --output_dir=$TRAIN_DIR

# デコード

DECODE_FILE=$DATA_DIR/decode_this.txt
echo "Hello world" >> $DECODE_FILE
echo "Goodbye world" >> $DECODE_FILE

BEAM_SIZE=4
ALPHA=0.6

t2t-trainer \
  --data_dir=$DATA_DIR \
  --problems=$PROBLEM \
  --model=$MODEL \
  --hparams_set=$HPARAMS \
  --output_dir=$TRAIN_DIR \
  --train_steps=0 \
  --eval_steps=0 \
  --decode_beam_size=$BEAM_SIZE \
  --decode_alpha=$ALPHA \
  --decode_from_file=$DECODE_FILE

cat $DECODE_FILE.$MODEL.$HPARAMS.beam$BEAM_SIZE.alpha$ALPHA.decodes



インストール




# tensorflowまたはtensorflow-gpuがインストールされていると仮定
pip install tensor2tensor

# tensorflow-gpuの場合
pip install tensor2tensor[tensorflow_gpu]

# tensorflow(cpu)の場合
pip install tensor2tensor[tensorflow]
 


バイナリ:
# データ生成
t2t-datagen

# トレーナー
t2t-trainer --registry_help
 
 
ライブラリの使い方:
python -c "from tensor2tensor.models.transformer import Transformer"



機能



  • 多くの最先端のモデルとベースラインモデルが組み込まれており、新しいモデルを簡単に追加できます(問題を開くかプルリクエストしてください)。
  • モダリティ(テキスト、オーディオ、画像)の生成と使用が可能な多くのデータセット、および新しいものを簡単に追加できます(Issueを開くか公開データセットを pull request !)。
  • モデルは、任意のデータセットおよび入力モード(または複数のモード)で使用できます。すべてのモダリティ固有の処理(例えば、テキストトークンのためのルックアップの埋め込み)は、データセット/タスク仕様の特徴ごとに指定された Modality オブジェクトで行われます。
  • マルチGPUマシンと同期(1マスター、多くのワーカー)および非同期(パラメタサーバーを介して同期する独立したワーカー)分散トレーニングをサポート。
  • データ生成スクリプト t2t-datagen とトレーニングスクリプト t2t-trainer を使用して、コマンドラインフラグでデータセットとモデル間を簡単にスワップします。

T2T 概要

データセット

データセット はすべて tensorflow.Exzample プロトコルバッファの TFRecord ファイルで標準化されています。すべてのデータセットは データジェネレータ  で登録および生成され、多くの共通シーケンスデータセットはすでに生成および使用可能です。



問題およびモダリティ


問題 は、主に入出力 モダリティ (記号、画像、音声、ラベルなど)とボキャブラリ(該当する場合)を設定することによって、データセットとタスクのトレーニング時のハイパーパラメータを定義します。 すべての問題は problem_hparams.py で定義されています。 modality.py で定義されている モダリティ は、モデルがモダリティに依存しないテンソルを扱うように入出力データ型を抽象化します。



モデル


T2TModels は、入力/出力モダリティまたはタスクとは独立したコア tensor-to-tensor 変換を定義します。 モデルは高密度のテンソルを取り込み、高密度のテンソルを生成し、タスクに依存するモダリティ(例えば、最終的な線形変換を介して与えられ、クラスに対するソフトマックスの logits を生成する)によって最後のステップで変換される。 すべてのモデルは models.py にインポートされ、 t2t_model.py で定義された T2TModel から継承されます。


  • そして、 @registry.register_modelで登録されてます。



ハイパーパラメータセット


ハイパーパラメータセット は、 @registry.register_hparams で定義され、コードで登録され、 tf.contrib.training.HParams オブジェクトにエンコードされます。 HParam は問題仕様とモデルの両方に対応しています。 ハイパーパラメータの基本セットは common_hparams.py で定義され、ハイパーパラメータセット関数は他のハイパーパラメータセット関数を構成することができます。



トレーナ


トレーナ バイナリは、トレーニング、評価、および推論の主要なエントリポイントです。 --model --problems --hparams_set フラグを使用することで、ユーザは問題、モデル、およびハイパーパラメータセットを簡単に切り替えることができます。 特定のハイパーパラメータは、 --hparams フラグで上書きすることができます。 --schedule   および関連フラグは、ローカルおよび分散トレーニング/評価( "分散トレーニングドキュメント"  )を制御します。



コンピュータの追加


T2Tのコンポーネントは、簡単に新しいものを追加し、コマンドラインフラグで簡単に交換できる中央登録メカニズムを使用して登録されます。 t2t-trainerに--t2t_usr_dirフラグを指定することで、T2Tコードベースを編集せずに独自のコンポーネントを追加できます。

現在、モデル、ハイパーパラメータセット、およびモダリティでこれを行うことができます。 あなたのコンポーネントが他の人にとって役に立ちそうな場合はプルリクエストを提出してください。

新しいハイパーパラメータセットを使用した例を次に示します:


# ~/usr/t2t_usr/my_registrations.py 内

from tensor2tensor.models import transformer
from tensor2tensor.utils import registry

@registry.register_hparams
def transformer_my_very_own_hparams_set():
  hparams = transformer.transformer_base()
  hparams.hidden_size = 1024
  ...


# ~/usr/t2t_usr/__init__.py 内
import my_registrations


t2t-trainer --t2t_usr_dir=~/usr/t2t_usr --registry_hel

登録されたHParamの下に、 transformer_my_very_own_hparams_set が表示されます。これはコマンドラインで --hparams_set フラグを使って直接使用できます。


データセットの追加


"データ生成 README" を参照のこと。

注:これは公式のGoogleサービスではありません。
---------

とりあえずワークフロー通りに打ち込んでいるのだけど、
データ取得がおもいのほか時間がかかっていて
もう1時間位たってるのだけど、まだおわっていない...

...やるしかないか

(翌日)
ようやくダウンロードおわっていたが、$HOMEを使ってるせいでパンパン。

でトレーニングを開始。

..問題なく始まった..とおもったらすぐに以下のメッセージが出て終了。

ResourceExhaustedError (see above for traceback): OOM when allocating tensor with shape[204,40,1,2048]
         [[Node: body/model/parallel_0/body/decoder/layer_0/conv_hidden_relu/Greater = Greater[T=DT_FLOAT,
 _device="/job:localhost/replica:0/task:0/gpu:0"](body/model/parallel_0/body/decoder/layer_0/conv_hidden_r
elu/conv1_single/Relu, body/model/parallel_0/body/decoder/layer_0/conv_hidden_relu/Greater/y)]]
         [[Node: body/model/parallel_0/body/decoder/layer_1/decoder_self_attention/dot_product_attention/M
ax/_2685 = _Recv[client_terminated=false, recv_device="/job:localhost/replica:0/task:0/cpu:0", send_device
="/job:localhost/replica:0/task:0/gpu:0", send_device_incarnation=1, tensor_name="edge_10090_body/model/pa
rallel_0/body/decoder/layer_1/decoder_self_attention/dot_product_attention/Max", tensor_type=DT_FLOAT, _de
vice="/job:localhost/replica:0/task:0/cpu:0"]()]]

OOM="Out Of Memory" だろうなあ..
ちなみに使ってるGPUは GeForce1050Ti/4GB。

しょうがないのでコメント欄にあったOOM対策をつかってみることに。
--hparams='batch_size=2048'でうごかしてみた。

INFO:tensorflow:global_step/sec: 1.34169
INFO:tensorflow:step = 102, loss = 8.53071 (74.533 sec)

が繰り返し出るようになったので、バッチが動き始めたようだ..


..で、コレいつおわるんだろう..

やっぱ論文にあるうんちゃらdaysかかるんだろうなあ..

しばらくは、放置プレイか..

ちなみにこの状態で進捗を確認したいのであれば、
別ターミナルで
tensorboard --logdir=/root/t2t_train/wmt_ende_tokens_32k/transformer-transformer_base_single_gpu
を実行して http://IPアドレス:6006/ を開けば
みんなだいすきTensorBardで状況が確認できます。






さすがOSS、SCALARSやGRAPHSだけでなく、IMAGESやDISTRIBUTIONS、HISTGRAMS、EMBEDDINGSまで可視化できるようになってる。


------
(数日後)

ふとトレーニングプロセスが落ちていることがわかった。lossをみると1.6あたりだったので
ワークフローを継続してみた。

root@07599f5e67a4:/notebooks/work/t2t# t2t-trainer --data_dir=$DATA_DIR --problems=$PROBLEM --model=$MODEL --hparams_set=$HPARAMS --output_dir=$TRAIN_DIR --tr
ain_steps=0 --eval_steps=0 --decode_beam_size=$BEAM_SIZE --decode_alpha=$ALPHA --decode_from_file=$DECODE_FILE
INFO:tensorflow:Creating experiment, storing model files in /root/t2t_train/wmt_ende_tokens_32k/transformer-transformer_base_single_gpu
INFO:tensorflow:datashard_devices: ['gpu:0']
INFO:tensorflow:caching_devices: None
INFO:tensorflow:Using config: {'_save_summary_steps': 100, '_keep_checkpoint_max': 20, '_tf_random_seed': None, '_num_ps_replicas': 0, '_task_id': 0, '_cluste
r_spec': , '_save_checkpoints_secs': 600, '_is_chief': True, '_tf_config': gpu_opt
ions {
  per_process_gpu_memory_fraction: 1.0
}
, '_model_dir': '/root/t2t_train/wmt_ende_tokens_32k/transformer-transformer_base_single_gpu', '_keep_checkpoint_every_n_hours': 10000, '_num_worker_replicas'
: 0, '_save_checkpoints_steps': None, '_master': '', '_session_config': allow_soft_placement: true
graph_options {
  optimizer_options {
  }
}
, '_evaluation_master': '', '_environment': 'local', '_task_type': None}
INFO:tensorflow:Performing Decoding from a file.
INFO:tensorflow:Getting sorted inputs
INFO:tensorflow: batch 1
INFO:tensorflow:Deocding batch 0
INFO:tensorflow:datashard_devices: ['gpu:0']
INFO:tensorflow:caching_devices: None
INFO:tensorflow:Beam Decoding with beam size 4
INFO:tensorflow:Doing model_fn_body took 2.638 sec.
INFO:tensorflow:This model_fn took 2.863 sec.
2017-07-18 08:58:57.662260: W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use SSE4.1 instructions, but these a
re available on your machine and could speed up CPU computations.
2017-07-18 08:58:57.662295: W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use SSE4.2 instructions, but these a
re available on your machine and could speed up CPU computations.
2017-07-18 08:58:57.900032: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:893] successful NUMA node read from SysFS had negative value (-1), but ther
e must be at least one NUMA node, so returning NUMA node zero
2017-07-18 08:58:57.900388: I tensorflow/core/common_runtime/gpu/gpu_device.cc:940] Found device 0 with properties:
name: GeForce GTX 1050 Ti
major: 6 minor: 1 memoryClockRate (GHz) 1.392
pciBusID 0000:01:00.0
Total memory: 3.94GiB
Free memory: 3.90GiB
2017-07-18 08:58:57.900416: I tensorflow/core/common_runtime/gpu/gpu_device.cc:961] DMA: 0
2017-07-18 08:58:57.900430: I tensorflow/core/common_runtime/gpu/gpu_device.cc:971] 0:   Y
2017-07-18 08:58:57.900446: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1030] Creating TensorFlow device (/gpu:0) -> (device: 0, name: GeForce GTX 1050
 Ti, pci bus id: 0000:01:00.0)
INFO:tensorflow:Restoring parameters from /root/t2t_train/wmt_ende_tokens_32k/transformer-transformer_base_single_gpu/model.ckpt-250000
INFO:tensorflow:Inference results INPUT: Goodbye world
INFO:tensorflow:Inference results OUTPUT: Gunstige Welt (和訳:u上にウムラウトである場合「好調な世界」)
INFO:tensorflow:Inference results INPUT: Hello world
INFO:tensorflow:Inference results OUTPUT: Hallo Welt (和訳:こんにちは世界)
INFO:tensorflow:Writing decodes into /root/t2t_data/decode_this.txt.transformer.transformer_base_single_gpu.beam4.alpha0.6.decodes
root@07599f5e67a4:/notebooks/work/t2t#


Googbye はきちんと理解していないらしくGoodで代替したんじゃないかともう。

とりあえず、日独翻訳(Tensor2Tensor)はGeForce1050Tiでも動くことはわかった。

なので、ニューホライ●ンの3年のテキストから適当に文章を抜き出して翻訳させてみた。
以下、その実行である。

-----

日本語 原文の日本語訳
INPUT 原文(英語)
OUTPUT Tensor2tensor のアウトプットテキスト(ドイツ語)
GOOGLE 原文をGoogle翻訳でドイツ語に翻訳したテキスト



日本語 チームを全国大会に導くことができる選手になりたい。
INPUT I want to be a player who can lead a team to the national tournament.
OUTPUT Ich m\xf6chte ein Spieler sein, der ein Team zum nationalen Turnier f\xfchren kann.
GOOGLE Ich möchte ein Spieler sein, der ein Team zum nationalen Turnier führen kann.


日本語 第三に、私たちが学校の制服を着用するとき、私たちは学校に属していると感じることができます。
INPUT Third, when we wear school uniforms, we can feel that we belong to our school.
OUTPUT Drittens, wenn wir die Schulen tragen, k\xf6nnen wir das Gef\xfchl haben, dass wir unserer Schule angeh\xf6ren.
GOOGLE Drittens, wenn wir Schuluniformen tragen, können wir fühlen, dass wir zu unserer Schule gehören.


日本語 彼女が望んでいる世界は簡単に来ないかもしれないが、彼女はそれのために努力し続ける。
INPUT The world that she wants may not come easily, but she keeps striving for it.
OUTPUT Die Welt, die sie will, wird vielleicht nicht leicht, aber sie strebt immer wieder nach.
GOOGLE Die Welt, die sie will, mag nicht leicht kommen, aber sie strebt danach.


日本語 はい。 彼女はミャンマーの民主主義と人権のために戦う政治家です。
INPUT Yes. She is a political leader who fights for democracy and human rights in Myanmar.
OUTPUT Ja, sie ist ein Politiker, der f\xfcr Demokratie und Menschenrechte in Myanmar k\xe4mpft.
GOOGLE Ja. Sie ist ein politischer Führer, der für die Demokratie und die Menschenrechte in Myanmar kämpft.


日本語 彼女は合計15年間拘束されたが、決して諦めなかった。
INPUT She was locked up for 15 years in total, but she never gave up.
OUTPUT Sie wurde insgesamt 15 Jahre eingesperrt, aber sie hat nie aufgegeben.
GOOGLE Sie war für 15 Jahre gesperrt, aber sie gab niemals auf.


日本語 人々は強力なリーダーを必要とし、アウンサンスーチーに彼らに加わるように頼んだ。
INPUT People needed a strong leader, and asked Aung San Suu Kyi to join them.
OUTPUT Die Menschen brauchten einen starken Anf\xfchrer, und sie haben Aung San Suu Kyi aufgefordert, sich ihnen anzuschlie \xdfen.
GOOGLE Die Leute brauchten einen starken Führer und baten Aung San Suu Kyi, sich ihnen anzuschließen.


日本語 私たちはさまざまなアイデアを集め、結局素晴らしい映画を完成させました。
INPUT We brought different ideas together, and completed a wonderful movie in the end.
OUTPUT Wir haben verschiedene Ideen zusammengebracht und am Ende einen wunderbaren Film vervollst\xe4ndigt.
GOOGLE Wir brachten verschiedene Ideen zusammen und vervollständigten einen wunderbaren Film.


日本語 私はアメリカにも学校制服を持っていなければならないと思います。
INPUT I think that we should also have school uniforms in the United States.
OUTPUT Ich glaube, dass wir auch in den Vereinigten Staaten SchulUniformen haben sollten.
GOOGLE Ich denke, dass wir auch Schuluniformen in den Vereinigten Staaten haben sollten.


日本語 1989年、政府は彼女の運動を止めるために自宅で逮捕した。
INPUT In 1989, the government put her under house arrest to stop the movement.
OUTPUT 1989 hat die Regierung sie unter Hausarrest gestellt, um die Bewegung zu stoppen.
GOOGLE Im Jahr 1989 stellte die Regierung sie unter Hausarrest, um die Bewegung zu stoppen.


日本語 これは私の学校生活の中で最高の経験です。
INPUT This is the greatest experience that I've had in my school life.
OUTPUT Das ist die gr\xf6\xdfte Erfahrung, die ich in meinem Schulleben erlebt habe.
GOOGLE Das ist die größte Erfahrung, die ich in meinem Schulleben hatte.


日本語 私のグループには、4人のメンバがいましたが、それぞれに異なるアイデアや意見がありました。
INPUT My group had four members who all had different ideas and opinions.
OUTPUT Meine Fraktion hatte vier Mitglieder, die alle verschiedene Ideen und Meinungen hatten.
GOOGLE Meine Gruppe hatte vier Mitglieder, die alle verschiedene Ideen und Meinungen hatten.


日本語 映画制作は私の学校で非常に人気のある選択授業です。
INPUT Filmmaking is an elective class that is very popular in my school.
OUTPUT In meiner Schule ist die Filmforschung eine gew\xe4hlte Klasse, die sehr beliebt ist.
GOOGLE Filmmaking ist eine Wahlklasse, die in meiner Schule sehr beliebt ist.


日本語 結局、彼女はミャンマーに滞在し、再び彼を見たことはありませんでした。
INPUT In the end, she stayed in Myanmer and never saw him again.
OUTPUT Am Ende blieb sie in Myanmer und sah ihn nie wieder.
GOOGLE Am Ende blieb sie in Myanmar und sah ihn nie wieder.


日本語 映画製作は私に違いを受け入れ、他の人から学ぶことを教えてくれました。
INPUT Filmmaking taught me to accept differences and learn from other people.
OUTPUT Die Filme lehrten mich, Unterschiede zu akzeptieren und von anderen Menschen zu lernen.
GOOGLE Filmmaking lehrte mich, Unterschiede zu akzeptieren und von anderen Menschen zu lernen.


日本語 ニューヨークでは、世界中の人々と出会った。
INPUT In New York, I've met people from all over the world.
OUTPUT In New York habe ich Menschen aus aller Welt getroffen.
GOOGLE In New York habe ich Leute aus der ganzen Welt kennengelernt.


日本語 私は3年間バレーボールチームのメンバでした。
INPUT I've been a member of the volleyball team for three years.
OUTPUT Ich bin seit drei Jahren Mitglied des Volleyball-Teams.
GOOGLE Ich bin seit drei Jahren Mitglied des Volleyballteams.


日本語 多くの日本人学生は学校制服を着用しているが、アメリカ人のほとんどはそうではない。
INPUT Many Japanese students wear school uniforms, but most American do not.
OUTPUT Viele japanische Studenten tragen Schulen Uniformen, aber die meisten Amerikaner nicht.
GOOGLE Viele japanische Studenten tragen Schuluniformen, aber die meisten Amerikaner nicht.


日本語 1999年、アウンサンスーチーさんの夫はがんで死にそうになっていました。
INPUT In 1999, Aung San Suu Kyi's husband was dying of cancer.
OUTPUT 1999 starb der Mann von Aung San Suu Kyi an Krebs.
GOOGLE Im Jahr 1999 war Aung San Suu Kyis Ehemann an Krebs gestorben.


日本語 私と一緒になっていくのは簡単ではありませんでした。
INPUT It wasn't easy for me to get along with them.
OUTPUT Es war f\xfcr mich nicht leicht, sie zu unterst\xfctzen.
GOOGLE Es war nicht leicht für mich, mit ihnen zu kommen.


日本語 私の学校には様々な文化の学生もいます。
INPUT There are students of various cultures in my school, too.
OUTPUT Auch in meiner Schule gibt es Studenten verschiedener Kulturen.
GOOGLE Es gibt auch Studenten verschiedener Kulturen in meiner Schule.


日本語 私は以前に日本に住み、去年ここに移住しました。
INPUT I lived in Japan before, and moved here last year.
OUTPUT Ich habe zuvor in Japan gelebt und bin vergangenes Jahr hierher gegangen.
GOOGLE Ich wohnte schon in Japan und bin im letzten Jahr hierher gekommen.


日本語 私はニューヨークに住む15歳の少女、滝川恵理子です。
INPUT I'm Takigawa Erika, a 15-year-old girl living in New York.
OUTPUT Ich bin Takigawa Erika, ein 15-j\xe4hriges M\xe4dchen, das in New York lebt.
GOOGLE Ich bin Takigawa Erika, ein 15-jähriges Mädchen, das in New York lebt.


日本語 世界は、民主主義と人権のための彼女の努力を認識しました。
INPUT The world recognized her efforts for democracy and human rights.
OUTPUT Die Welt hat ihre Bem\xfchungen um Demokratie und Menschenrechte anerkannt.
GOOGLE Die Welt erkannte ihre Bemühungen um Demokratie und Menschenrechte.


日本語 それに加わった多数の人々が殺された。
INPUT A great number of people who joined it were killed.
OUTPUT Es wurden zahlreiche Menschen get\xf6tet.
GOOGLE Eine große Anzahl von Leuten, die sich ihm angeschlossen haben, wurde getötet.


結構いい感じの翻訳をだしていて、中にはGoogle翻訳本体と全く同じ答えもでていた。

ご参考迄。

-----
(後日談)NVIDIA K20C で Tensor2Tensor を動かしてみた
 

0 件のコメント:

TensorFlowにおけるフィーチャ列はこうしてね的なブログ記事を翻訳してみた

TensorFlow 1.4.0 になってイロイロガチャガチャしている。 一番ビックリしたのがTutorialのSequence-to-Sequence。 イキナリブログ記事のリンクだけになっていた.. Sequence-to-Sequence Models ht...