UberオープンソースのNeuropodは、機械学習フレームワークの抽象化レイヤであり、研究者は統合の労力を削減しながら、選択したフレームワークでモデルを構築できるため、同じプロダクションシステムで異なるフレームワークに実装されたモデルを交換できる。Neuropodは現在、TensorFlow、PyTorch、Keras、TorchScriptなどのいくつかのフレームワークをサポートしている。
UberのAdvanced Technologies Group (ATG) の上級自律エンジニアであるVivek Panyam氏は、ブログ投稿でNeuropodについて説明した。ATGの研究者は、長年にわたってCaffe2、TensorFlow、PyTorch、JAXなどいくつかのディープラーニングフレームワークを採用してきた。プロダクション環境で新しいフレームワークを使用するには、いくつかの異なるシステムコンポーネントでの統合作業が必要だった。ATGのエンジニアは、統合の負担を軽減する方法としてNeuropodを開発した。Panyam氏によると、
昨年、私たちはUber ATG、Uber AI、およびコアUberビジネス全体に数百のNeuropodモデルをデプロイしてきました。
ATGの選択したディープラーニングフレームワークは、研究者がさまざまなフレームワークが特定のタスクに多かれ少なかれ適している可能性があることを発見したことで、時間とともに進化してきた。2016年、ATGの主要なフレームワークはCaffe2だった。その後数年間で、チームはTensorFlow、PyTorch、JAXなどのサポートを追加した。新しいフレームワークをサポートするには、Uberのインフラストラクチャとツールの各コンポーネントとの統合が必要であり、依存関係の競合やメモリ破壊などの問題がよく発生した。各モデルにはフレームワーク固有のメトリックパイプラインがあるため、同じ問題を解決することを目的とした異なるフレームワークのモデルのパフォーマンスを比較することは困難だった。
解決策は、モデルの抽象化レイヤであるNeuropodを構築することだった。Neuropodを使用するには、モデル開発者は最初に、モデルインターフェイスを定義する「課題API」の定義または仕様を作成する。仕様を実装するモデルはすべて、適切なフレームワークを呼び出すNeuropodで実行できる。これにより、開発者は、労力を費やすコードを書き直すことなく、異なるフレームワークで記述されたモデルであっても、異なるモデルを簡単に交換できる。Neuropodは現在、PythonまたはC++コードを使用したモデルのみをサポートしているが、Panyam氏は、追加の言語のサポートを追加することは「容易」であると述べている。
#Example Spec for 2d Object Detection (source: https://neuropod.ai/)
INPUT_SPEC = [
# BGR image
{"name": "image", "dtype": "uint8", "shape": (1200, 1920, 3)},
]
OUTPUT_SPEC = [
# shape: (num_detections, 4): (xmin, ymin, xmax, ymax)
# These values are in units of pixels. The origin is the top left corner
# with positive X to the right and positive Y towards the bottom of the image
{"name": "boxes", "dtype": "float32", "shape": ("num_detections", 4)},
# The list of classes that the network can output
# This must be some subset of ['vehicle', 'person', 'motorcycle', 'bicycle']
{"name": "supported_object_classes", "dtype": "string", "shape": ("num_classes",)},
# The probability of each class for each detection
# These should all be floats between 0 and 1
{"name": "object_class_probability", "dtype": "float32", "shape": ("num_detections", "num_classes")},
]
モデル自体は (「neuropod」と呼ばれる) パッケージにデプロイされ、テストコードとカスタムフレームワーク操作を含めることもできる。モデルは、呼び出しプロセスまたはアウトプロセスで実行できる。Neuropodのドキュメントでは、複数のモデル間でPython GILを共有しないなど、アウトプロセス実行のいくつかの潜在的な利点が強調されている。
Panyam氏は、Hacker NewsでNeuropodに関するディスカッションに参加し、いくつかの質問に答えた。あるユーザは、Neuropodが機械学習の相互運用形式であるONNXとどのように違うのか疑問に思った。Panyam氏は次のように答えた:
Neuropodは抽象化レイヤであるため、モデルをローカルで実行するだけでなく、有益なことを実行できます。たとえば、モデルの実行をリモートマシンに透過的にプロキシできます...すべてのクラスタマシンにGPUを含めることは、リソース効率の観点からは意味がありません。代わりに、モデルの実行をGPU対応サーバのより小さなクラスタにプロキシする場合、より少ないGPUを使用しながら、より高いGPU使用率を得ることができます。
Panyam氏はまた、プロジェクトのロードマップには、TensorRTだけでなくONNXのサポートの追加も含まれていると述べた。
Neuropodは、Uberがリリースした他のいくつかのオープンソースディープラーニングプロジェクトに参加している。2017年、Uberはエンド to エンドのMLプラットフォームであるMichelangeloと分散型ディープラーニングトレーニングフレームワークであるHorovodをオープンソース化した。昨年、UberはコードフリーのディープラーニングツールボックスであるLudwigをリリースした。NeuropodのソースコードはGitHubで入手できる。