メインコンテンツへジャンプ
Engineering blog

新しい概念、言語、システムについて学ぶ場合、どのような学習方法が有効でしょうか。新しいタスクを学ぶ際に、既に習得しているスキルとの類似点を探すのではないでしょうか。

学習者に好まれる学習過程の特性として、「親しみやすさ」、「わかりやすさ」、「シンプル」、の 3 つの共通点があります。これまでに習得した知識との共通点による親しみやすさは、新たな知識の習得に対する敷居を低くします。わかりやすさにより、内容を把握する際の負担が最小限になります。そして、シンプルであるということは、未知の事柄を取り入れる際の問題が少なく、新しい概念、言語、システムの習得による成果を高めます。

Aside from being popular among researchers, gaining adoption by machine learning practitioners in production, and having a vibrant community, PyTorch has a familiar feel to it, easy to learn, and you can employ it for your machine learning use cases.

このブログ投稿では、上に述べた 3 つの特徴をふまえつつ、PyTorch の習得についてその容易さの理由を探ります。そして、Databricks のレイクハウスプラットフォームにより、学習が進めやすくなる仕組みについて解説します。

1a. PyTorch は Pythonic である

ルチアーノ・ラマーリョ著「Pythonicな思考とコーディング手法」では、Python のコードをより簡潔で読みやすくするための理想的な記述様式を Pythonic として定義しています。Pythonic であるということはつまり、Python のオブジェクトが特定のルールに従って構成され、クラス、イテレータ、ジェネレータ、シーケンス、コンテキストマネージャ、モジュール、コルーチン、デコレータ等のいずれにおいても一貫したパターンに沿った動作が見込まれるということです。PyTorch は、Pythonのデータモデル、モジュール、言語構成との共通点は少ないですが、 PyTorch API には、torch.tensor、torch.nn.Module、torch.utils.data.Datasets、torch.utils.data.DataLoaders など、類似した構成が見出せます。また、PyTorch では、Pandas、scikit-learn、SciPy などの PyDataパッケージを使用して簡潔なコードを記述することが可能です。

PyTorch は PyData エコシステムと統合されており、NumPy を使用した経験があれば、ごく簡単に TorchTensor を扱えるようになるでしょう。NumPy の配列と Tensor のデータ構造と操作方法はよく似ています。ちょうど DataFrame が Apache Spark™ の核となるデータ構造であるのと同じように、Tensor を PyTorch モデル、トレーニングオペレーション、コンピューティング、スコアリングに対する入力として利用できます。PyTorch の Tensor を視覚的に表すと下の図のようになり、n 次元の NumPy 配列として表すことができます。

PyTorch の Tensor を視覚的に、n 次元の numPy 配列として表すことができます。

例えば、NumPy 配列を作成し、出来た配列を Torch Tensor に変換するという操作がシームレスに行えます。下のコードに示すように、NumPy の操作は Tensor の操作と類似性があります。

どちらも Python で API を利用する際によくみられる命令文が使えます。リスト、タプル、ディクショナリ、セット等の使いなれたオブジェクトも普段と同じような操作で扱えます。NumPy の配列操作の経験を Torch Tensor の操作に生かすことができるのです。次のコード例を確認してみてください。

最新リリースである PyTorch 1.8.0 では、高速フーリエ変換/逆変換の処理についても、NumPy とPyTorch Tensor の間で類似した操作になっています。

1b. PyTorch の NN モジュールは拡張しやすい

PyTorch のライブラリには、多層ネットワークアーキテクチャを構築するためのニューラルネットワーク(NN)モジュールが用意されています。PyTorch では、これらのモジュールにネットワークの各層が含まれ、基底クラスモジュール torch.nn.Module を元にして、簡単に単層または複合多層ニューラルネットワークを構築できます。PyTorch のネットワークモジュールクラスとそのメソッドをカスタマイズして定義する際には、Python の基底クラスオブジェクトを元にしてカスタムオブジェクトクラスを作成するのと同様のパターンが利用できます。では例として、シンプルな二層の線形ネットワークを定義してみましょう。

TwoLayeredNet カスタムクラスのフローと構成に注目してください。Pythonic であることがみてとれます。torch.nn.Module の派生クラスであり、クラスイニシャライザーでパラメータを指定し、インターフェースのメソッドを定義しています。また、呼び出し可能です。これは、基底クラスである torch.nn.Module で、Python の特殊メソッドである __call__() オブジェクトメソッドが実装されているためです。これはシンプルな二層モデルですが、Python の基底クラスオブジェクトが元となっており、Python と同じような感覚でクラスを拡張できることが分かります。

さらに、PyTorch API の構文、構成、形式、動作などは全て Python のアプリケーションコードと類似していることから、直感的な読み書きが可能です。そのため、PyTorch のモジュールと API がほとんど違和感なく利用でき、新しい PyData パッケージの API について学び、Python のアプリケーションコードに組み込む場合とほぼ同じ感覚で利用できます。

Pythonic なコードについて詳しくは、このブログの参考資料である Notebook を参照してください。PyTorch でのトレーニングループや損失関数の命令コード記述方法、よく使用される Python のイテレーションコンストラクタ、GPU 向けの CUDA ライブラリの使用について確認できます。

下の例では、Python でよく使用される言語構成を使って、イテレーションによるシンプルなトレーニングループを定義しています。

次の章では、Python のカスタムクラスとシンプルな PyTorch ニューラルネットワークの間にみられる特徴的なパターンとフローについて説明します。この場合も、コードは Python のコードと同じように読むことができます。この Pythonic なパターンでは、PyTorch の Dataset と DataLoaders を使ってイテレータを記述する際に、Python のプロトコルがどのように利用されるかがよく分かります。

1c. PyTorch の Dataset を扱う Dataloaders はカスタマイズが容易

PyTorch でデータを読み取る際の重要なユーティリティにtorch.utils.data.DataLoaderクラスがあります。このクラスは、トレーニング時の 1エポック分の入力をバッチごとに繰り返すもので、PyTorch でトレーニングの反復を行う際に欠かせないものです。DataLoaders では、Python のシーケンスとイテラブルなプロトコルが実装されており、オブジェクトに特殊メソッド __len__ と __getitem__ が実装されています。 ここでもやはり Pythonic な動作がみてとれます。つまり、実装の一部としてリスト内包表記が使用でき、NumPy 配列で Tensor に変換して n番目のデータアイテムをランダムアクセスで取得します。Python で処理する際と同様のアクセスパターンと動作が守られているわけです。

ではここで、モデルのトレーニングに使用される温度に関するシンプルなカスタム Dataset について確認してみましょう。データセットには、画像などのより特徴量の多い Tensor データセットを用いても構いません。

PyTorch の Dataloader クラスでは、カスタマイズされた FahrenheitTemperatures クラスオブジェクトのインスタンスをパラメータとして取ります。このようなユーティリティクラスは、PyTorch のトレーニングループでは標準的なものです。その結果、イテレータのようにデータをバッチごとに反復処理することが可能となります。非常にシンプルな方法でとても Pythonic です。

ここでは、独自のカスタム Dataset を実装しているので、PyTorch のトレーニングループで使用してみましょう。

以上のように、PyTorch のコードでは、既存の内容と類似性があり、明確であり、シンプルであるという Pythonic な記述が行えます。Databricks のレイクハウスプラットフォームは、PyTorch のように実際に Pythonic であるわけではありませんが、基本的な考え方を踏襲しています。次の章では、この Databricks レイクハウスプラットフォームの機械学習用ランタイムが、PyTorch の習得にどのように役立つかを解説します。

2. Python パッケージのインストールが不要

Databricks のレイクハウスプラットフォームには、機械学習(ML)用ランタイムが、最新バージョンの Python、PyTorch、PyData エコシステムパッケージ、その他の標準 ML ライブラリと共に事前にインストールされています。また、ランタイム環境が準備済みですぐに利用できるため、パッケージのインストールや管理の負担もありません。他の Python パッケージをインストールしたい場合は、%pip install を実行すればいいだけです。このようなクラスタ上のパッケージ管理機能は Databricks のユーザーからも好評で、モデル開発ライフサイクルの一貫として広く使用されています。

事前にインストールされているパッケージの一覧を確認するには、pip list を実行してください。

機械学習用の Databricks ランタイムに事前インストールされている全てのパッケージの一覧を確認するには、pip listを実行してください。

3. CPU または GPU の使用が容易

深層学習用のニューラルネットワークでは、規模の大きな高ランクテンソルでのドット積や行列積などの数値集約型コンピューティングが行われることもあります。GPU を必要とするコンピュートバウンドな PyTorch アプリケーションであれば、GPU を使用する MLR クラスタが作成され、データが GPU に渡されたうえで使用されます。このように、上述の TwoLayeredNet の例が CUDA を使用するように、全てのトレーニングが GPU で行われます。

なお、この例では、シンプルなコードでランダムに生成されたテンソルの行列積を実行していますが、実際の PyTorch アプリケーションでは、forward パス、backward パス、および auto-grad 実行などで、より多くの集約型コンピューティングが行えます。

ランダムに生成された 2 つのテンソルの行列乗算を示す Databricks レイクハウスプラットフォームからの Pytorch コードの例

4. TensorBoard の利用が容易

既にこちらのブログで紹介していますが、Databricks Runtime(DBR)の一部として特殊コマンド %tensorboard を使用することで、TensorBoard で取得したトレーニングメトリックを同一 Notebook 内で表示することが可能です。使用している Notebook の画面とは別のタブを開いて TensorBoard を起動させる必要がありません。この TensorBoard の組み込み表示により、開発時のエクスペリエンスが大きく向上し、よりシンプルに作業が行えるようになります。また、PyTorch の開発者が各メトリックを TensorBoard ですぐに確認できるようにもなります。

では、TensorBoard のログを使用して、PyTorch FashionMNIST のサンプルを実行してみましょう。
まず、SummaryWriter を定義し、次いで、FashionMNIST Dataset  DataLoader にPyTorch の torchvision.models.resnet50 モデルを使用して読み込みます。

PyTorch FashionMNIST のサンプルの実行例

Databricks の Notebook の特殊コマンドを使用することで、セル内で TensorBoard を起動させ、トレーニングメトリックやモデル出力を確認できます。

%load_ext tensorboard

%tensorboard --logdir=./runs

5. PyTorch は MLflow と統合されている

Databricks では、よりシンプルなソリューションの実現を目指して、MLflow fluent tracking API を拡張し、メトリック、タグ、パラメータ、アーティファクトなどの MLflow エンティティの自動ロギングが行えるようにしています。そして、対象となる ML ライブラリには PyTorch Lightning も含まれています。Notebook の右上隅にある Experiment アイコンから、ワークスペースに欠かせない要素である MLflow UI を介して、MLflow上の全ての実験にアクセスできます。トレーニング中に実行される実験は、全て自動的に MLflow のトラッキングサーバーに記録されます。MLflow エンティティのログを取得するために、特にトラッキング API を使用する必要はなく、イメージ、ディクショナリ、テキストアーティファクトなどの他エンティティのトラッキングとロギングも行えます。

下に示すのは、PyTorch Lightning の FashionMNIST インスタンスの例です。トレーニングループのステップだけで、検証やテストのない最小限のコードになります。ここでは、MLflow を使用して MLflow エンティティの自動ロギングを行う方法が示されています。MLflow UI を詳細に調べ、Notebook 内からの実行について確認し、モデルの登録とその配信や配置を行っています。

PyTorch Lightning の FashionMNIST インスタンス。トレーニングループのステップだけです。ここでは、MLflow を使用して MLflow エンティティの自動ロギングを行い、MLflow UI を詳細に調べ、モデルの登録とその配信や配置を行っています。

Python のクラス作成と同じようにして PyTorch モデルを作成し、FashionMNIST DataLoader と PyTorch Lightning Trainerを使用します。また、trainer.fit() メソッドの実行時に全ての MLflow エンティティについて自動ロギングを行います。

FashionMNIST DataLoader、PyTorch Lightning Trainerを使用します。また、trainer.fit() メソッドの実行時に全ての MLflow エンティティについて自動ロギングを行います。

6. MLflow で記録した PyTorch モデルを TorchScript に変換可能

TorchScript を使用すると、PyTorch のコードからシリアライズと最適化が可能なモデルを作成できます。MLflow で記録した PyTorch モデルを TorchScript 形式に変換して保存し、パフォーマンスの高い独立したプロセスとして読み込み、もしくは展開できます。また、エンドポイントとして、Databricks のクラスタに展開および配信することもできます。

このプロセスには次の手順が伴います。

  1. MLflow を使用した PyTorch モデルを作成する
  2. JIT を使ってモデルをコンパイルし、TorchScript モデルに変換する
  3. TorchScript モデルを記録または保存する
  4. TorchScript モデルを読み込む、または展開する

PyTorch Lightning の FashionMNIST インスタンス。トレーニングループのステップだけです。ここでは、MLflow を使用して MLflow エンティティの自動ロギングを行い、MLflow UI を詳細に調べ、モデルの登録とその配信や配置を行っています。

 

ここで全てのコードについて示すことは控えますが、 IrisClassification や MNIST のコードを GitHub の MLflow のサンプルディレクトリで参照できます。

7. 分散型トレーニングに関する PyTorch チュートリアルがすぐに利用可能

PyTorch のモデルトレーニングを分散させて行う際には、Databricks のレイクハウスの MLR クラスタが使用できます。チュートリアルが用意されており、a) シングルノードトレーニングの設定方法や、b) Horovod ライブラリに移行してトレーニングを分散させる方法について確認できます。これらのチュートリアルを全て確認すれば、PyTorch モデルの分散型トレーニングの適用方法を習得できます。すぐに利用でき、クラスタへのインポートも簡単な Notebook が用意されており、分散型トレーニングについて学ぶうえでよい足がかりとなることでしょう。推奨される設定に従うのであれば、モデルのトレーニングについて視聴するだけで十分です。

Databricks のレイクハウスプラットフォームでは、推奨される設定に従うのであれば、モデルのトレーニングについて視聴するだけで十分です。
© r/memes – Train モデルの見方の違いのミーム

次の各 Notebook では、MLR クラスタの設定手順ガイド、CPU または GPU のいずれかが使用できるようにコードを修正する方法、Horovod ライブラリを使用した分散型のモデルトレーニング方法を確認できます。

さらに、PyTorch のコミュニティでは、PyTorch のサンプルを使った優れたスターターチュートリアルが用意されています。コードをコピーして Databricks Notebook にペーストするか、Jupyter Notebook にインポートするだけで、Python の IDE 上で実行するのと同じように、MLR クラスタ上でコードを実行できます。チュートリアルをひとおり実行すれば、PyTorch の Pythonic な命令規則と直感的な使用方法の感覚が把握できるでしょう。

Data + AI Summit において、PyTorch の本番環境での ML ユースケースに関するセッションをご覧いただけます。

次のステップ:開始するには

You can try the accompanying notebook in your MLR cluster and import the PyTorch tutorials mentioned in this notebook. If you don’t have a Databricks account, get one today for a free trial and have a go at PyTorch on Databricks Lakehouse Platform. For single-node training, limited functionality and only CPUs usage, use the Databricks Community Edition.