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

Scale Vision Transformers (ViT) on the Databricks Lakehouse Platform with Spark NLP

Scale Vision Transformers (ViT) on the Databricks Lakehouse Platform with Spark NLP

翻訳: junichi.maruyama 

イントロダクション

2017年のことですが、Google AIの研究者グループが、すべての自然言語処理(NLP)の基準を変えるトランスフォーマーモデルのアーキテクチャを紹介する論文を発表しました。これらの新しいTransformerベースのモデルは、NLPタスクに革命を起こしているように見えますが、コンピュータビジョン(CV)での使用はかなり制限されたままでした。これらの新しいTransformerベースのモデルは、NLPタスクに革命をもたらすように見えるが、コンピュータビジョン(CV)での使用はかなり制限されたままであった。コンピュータビジョンの分野は、畳み込みニューラルネットワーク(CNN)の使用によって支配されてきました。CNNをベースとした一般的なアーキテクチャ(ResNetなど)があります。Google Brainの別の研究チームは、2021年6月に「An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale 」と題した論文で「Vision Transformer(ViT)」に紹介しました。このブログ記事では、Hugging FaceからVision Transformer(ViT)モデルをスケールアウトして、加速された高性能な推論のために本番環境に展開する方法を示し、Databricks、Nvidia、Spark NLPを使用してViTモデルを21倍スケールする方法を説明します。

Spark NLPオープンソースプロジェクトの貢献者として、このライブラリがエンドツーエンドのVision Transformers(ViT)モデルのサポートを開始したことに興奮しています。私はSpark NLPや他のML/DLオープンソースライブラリを毎日仕事で使っており、最先端の画像分類タスクのためにViTパイプラインを展開し、Hugging FaceとSpark NLPの詳細な比較を提供しています。

この記事の長いバージョンは、Mediumに3つのパートシリーズとして公開されています:

このプロジェクトのノートブック、ログ、スクリーンショット、スプレッドシートはGitHubで提供されています。

ベンチマーク設定

データセットとモデル

  1. データセット ImageNet mini: サンプル (>3K) - フル (>34K)
    - KaggleからImageNet 1000 (mini)データセットをダウンロードしました。
    - 必要なのは、時間のかかるベンチマークを行うのに十分な画像だけだったので、34K以上の画像を持つ列車ディレクトリを選び、imagenet-miniと名付けました。
  2. モデル: Googleによる「vit-base-patch16-224」です。
    Hugging FaceでホストされているGoogleのこのモデルを使用する予定です。
  3. ライブラリのご紹介 Transformers & Spark NLP

コード

Scale Vision Transformers (ViT) on the Databricks Lakehouse Platform with Spark NLP

Spark NLPは、Apache Spark™の上に構築された最先端の自然言語処理ライブラリです。分散環境で容易にスケールする機械学習パイプラインのために、シンプルでパフォーマンスと精度の高いNLPアノテーションを提供します。Spark NLPには、200以上の言語に対応した7000以上の事前学習済みパイプラインとモデルが付属しています。また、トークン化、単語分割、品詞タグ付け、単語と文の埋め込み、名前付き固有表現認識、依存関係解析、スペルチェック、テキスト分類、感情分析、トークン分類、機械翻訳(+180言語)、要約と質問応答、テキスト生成、画像分類(ViT)、その他多くのNLPタスクが提供されています。

Spark NLPは、BERT、CamemBERT、ALBERT、ELECTRA、XLNet、DistilBERT、RoBERTa、DeBERTa、XLM-RoBERTa、Longformer、ELMOなどの最先端のトランスフォーマーを提供する量産中の唯一のオープンソースNLPライブラリです、 Universal Sentence Encoder、Google T5、MarianMT、GPT2、Vision Transformer (ViT) をPythonやRだけでなく、Apache Sparkをネイティブに拡張することでJVMエコシステム(Java、Scala、Kotlin)にもスケールアップしています。

ViTアーキテクチャによるモデルの学習が完了したら、NLPと同様にトランスフォーマーの事前学習とファインチューニングを行うことができます。Spark NLPでは、最近の4.1.0リリースで画像分類のためのViT機能が追加されました。この機能は、ViT For Image Classificationと呼ばれています。240以上のプレトレーニングモデルが用意されており、Spark NLPでこの機能を利用する簡単なコードは以下のようになります:

Scale Vision Transformers (ViT) on the Databricks Lakehouse Platform with Spark NLP

シングルノードでの比較 - Spark NLPはクラスタだけのものではありません!

シングルノードのDatabricks CPUクラスタ構成

Databricksでは、Apache Sparkを1台で使いたい、あるいはSpark以外のアプリケーション、特にMLやDLベースのPythonライブラリを使いたいという方に適したクラスタを作成する際に「Single Node」というクラスタタイプを用意しています。ベンチマークを始める前の、私のSingle Node Databricksのクラスタ構成はこんな感じです(CPUのみ):

Databricks single-node cluster — CPU runtime
Databricksシングルノードクラスタ - CPUランタイム

AWSのm5n.8xlargeインスタンスを利用したこのクラスタの概要は、1Driver(1ノードのみ)、128GBのメモリ、32CoresのCPU、そして1時間あたり5.71DBUのコストです。

まず、Single Node DatabricksのCPUにSpark NLPをインストールしましょう。クラスタ内のLibrariesタブで、以下の手順を踏む必要があります:

  • 新規インストール -> PyPI -> spark-nlp==4.1.0 -> インストール
  • 新規インストール -> Maven -> コーディネート -> com.johnsnowlabs.nlp:spark-nlp_2.12:4.1.0 -> インストール
  • クラスタ->アドバンスドオプション->スパーク->環境変数に`TF_ENABLE_ONEDNN_OPTS=1`を追加し、oneDNNを有効にする予定です。

How to install Spark NLP in Databricks on CPUs for Python, Scala, and Java
DatabricksのSpark NLPをCPUにインストールする方法(Python、Scala、Java向け)

シングルノードのDatabricks GPUクラスタ構成

新しいクラスタを作成しましょう。今回はGPU付きのランタイムを選択します。この場合、11.1 ML (includes Apache Spark 3.3.0, GPU, Scala 2.12) と呼ばれ、必要なCUDAとNVIDIAソフトウェアがすべてインストールされている状態になっています。次に必要なのは、GPUを搭載したAWSインスタンスも選択することで、GPUが1つ、コア/メモリ数が同じであるg4dn.8xlargeクラスタを選択しました。このGPUインスタンスは、Tesla T4と16GBメモリ(15GBの使用可能なGPUメモリ)を搭載しています。

Databricks single-node cluster — GPU runtime
Databricksシングルノードクラスタ - GPUランタイム

GPUクラスタ用のライブラリのセットアップは、CPUの場合と同様です。唯一の違いは、Mavenから「spark-nlp-gpu」を使用することです。つまり、「com.johnsnowlabs.nlp:spark-nlp_2.12:4.1.0」ではなく「com.johnsnowlabs.nlp:spark-nlp-gpu_2.12:4.1.0」になっています。

Benchmarking

DatabricksのシングルノードクラスターにSpark NLPをインストールしたので、CPUとGPUの両方でサンプルデータセットとフルデータセットのベンチマークを繰り返してみます。まずはサンプルデータセットに対して、まずCPUでのベンチマークから見てみましょう。バッチサイズ16で34Kの画像を処理し、そのクラスを予測し終えるまでに、ほぼ12分(1072秒)かかっています。最適なバッチサイズのベンチマークについては、この投稿のオリジナルリビジョンに記載されています。

より大きなデータセットでは、バッチサイズ8で34K以上の画像のクラス予測を終えるのに7分半(435秒)近くかかりました。CPUを搭載したシングルノードと1GPUを搭載したシングルノードのベンチマーク結果を比較すると、ここではGPUノードの勝利であることがわかります:

Spark NLP is up to 2.5x times faster on GPU vs. CPU in Databricks Single Node
Spark NLP is up to 2.5x times faster on GPU vs. CPU in Databricks Single Node

これはすごいことです!GPU上のSpark NLPは、oneDNNを有効にしてもCPUの約2.5倍高速であることがわかりますね。

この記事の拡張版では、最新のIntelアーキテクチャでoneDNNライブラリを使用した場合の影響についてベンチマークを実施しました。oneDNNはCPUの結果を10%から20%向上させました。

1台のマシンを超えたスケーリング

Spark NLPは、Spark MLを拡張したものです。Databricks を含む Apache Spark がサポートするすべてのプラットフォームで、ネイティブかつシームレスにスケールします。コードの変更は一切必要ありません!Spark NLPは、コードを何も変更することなく、1台のマシンから無限のマシンまでスケールすることができます!

AWSでCPUを搭載したDatabricksマルチノード

クラスタを作成し、今回はClusterモード内のStandardを選択します。つまり、クラスタ内に複数のノードを持つことができ、Apache Sparkの用語では、1つのドライバとN個のワーカー(実行者)を意味します。

Scale Vision Transformers (ViT) on Databricks platform with Spark NLP

また、この新しいクラスタにSpark NLPをLibrariesタブでインストールする必要があります。前のセクションで紹介した、CPUを搭載したSingle Node Databricksの手順を踏めばよいでしょう。ご覧のように、Hugging FaceとSpark NLPの両方のベンチマークに使用したのと同じCPUベースのAWSインスタンスを選択したので、ノードを増やしたときにどのようにスケールアウトするかを確認することができます。

Clusterの構成はこんな感じです:

Scale Vision Transformers (ViT) on Databricks platform with Spark NLP

以前のベンチマークで使用したSpark NLPパイプラインを再利用し(コードを変更する必要はありません)、34Kの画像を持つより大きなデータセットのみを使用します。ワーカーの数は2人から10人へと徐々にスケールさせています。

Databricks Multi-Node with GPUs on AWS

GPUベースのマルチノードDatabricksクラスタを持つことは、シングルノードクラスタを持つこととほとんど同じです。唯一の違いは、Standardを選択し、シングルノードのGPUのベンチマークで選択したのと同じAWSインスタンス仕様で同じML/GPU Runtimeを維持することです。

また、この新しいクラスタにSpark NLPをLibrariesタブでインストールする必要があります。以前と同じように、GPUを使ったシングルノードのDatabricksで紹介した手順に従えばよい。

Scale Vision Transformers (ViT) on Databricks platform with Spark NLP

念のため、各AWSインスタンス(g4dn.8xlarge)には、1つのNVIDIA T4 GPU 16GB(使用可能メモリ15GB)が搭載されています。

34Kイメージのベンチマークを2、4、8、10個のDatabricksノードで実行すると、CPUで112秒かかります(シングルノードでは1,072秒です)。GPUクラスタは435秒から50秒にスケールアップしています。

Scale Vision Transformers (ViT) on Databricks platform with Spark NLP

10ノードクラスタを使用すると、96%の効率を達成し、すなわち、シングルノード設定での実行よりも9.6倍高速になります。10ノードGPUクラスターは8.7倍高速に動作します。

Scale Vision Transformers (ViT) on Databricks platform with Spark NLP

Conclusions

Spark NLPは、10ノードのGPUクラスタでは、シングルノードのCPUクラスタよりも21.4倍高速で、pythonコードの1行も変更せずに実行できます。

Spark NLPは、Databricksプラットフォームと完全に統合されています。ぜひお試しください!

  • 詳細については、https://johnsnowlabs.com をご覧ください。
  • インストール方法はこちらでご覧いただけます。
  • John Snow LabsのSlack channelに参加すると、ヘルプを得ることができます。

 

Databricks 無料トライアル

関連記事

Hugging Faceトランスフォーマーのパイプラインを使ったNLPを始めよう

February 5, 2023 Paul Ogilvie による投稿 in エンジニアリングのブログ
Original Blog : Getting started with NLP using Hugging Face transformers pipelines 翻訳: junichi.maruyama 自然言語処理(NLP)の進歩は、企業がテキストデータから価値を引き出すための前例のない機会を解き放ちました。自然言語処理は、テキストの要約、人や場所などの固有名詞の認識、感情分類、テキスト分類、翻訳、質問応答など、幅広い用途に使用できます。多くの場合、大規模なテキストデータセットで事前に訓練された機械学習モデルから、高品質の結果を得ることができます。これらの事前学習済みモデルの多くは、オープンソースで公開されており、無料で使用することができます。 Hugging Face は、これらのモデルの素晴らしいソースの一つであり、彼らの Transformers ライブラリは、モデルを適用し、また自分のデータにも適応させるための使いやすいツールです。また、これらのモデルを自分のデータに合わせて微調整をすることも可能で
プラットフォームブログ一覧へ