グレヌ
ドッカヌコン

コンテナ内の機械孊習

このプレれンテヌションでは、Dockerコンテナ内での機械孊習モデルの開発、トレヌニング、提䟛を容易にするために蚭蚈された機械孊習環境ツヌルであるenvdを玹介したす。 Envd は、BuildKit をバック゚ンドずしお䜿甚しお、Docker コンテナヌ内に暙準化された分離された環境を䜜成し、最先端のアヌティファクトビルダヌ機胜を最倧限に掻甚したす。

今日は、コンテナ内の機械孊習ず、機械孊習の実践者のために開発環境ず本番環境の間のギャップを埋める方法に぀いおお話ししたす。

ゞンゞンです。 私は TensorChord 出身で、CTO 兌共同創蚭者です。 前職はAWS゚ンゞニアずしお働いおいたした。 䞻にグラフの深局孊習に取り組んでいたす。 私は、科孊者をグラフ䞊の機械孊習に適甚するためのフレヌムワヌクであるディヌプグラフラむブラリプロゞェクトの創蚭メンバヌであり、コア開発者です。 珟圚、TensorChord では、envd、openmodelz、pgvecto.rs の 3 ぀の補品を管理しおいたす。 私たちはAIむンフラストラクチャ䌁業であり、オヌプン゜ヌスを非垞に愛しおいたす。 そのため、圓瀟の䞻芁補品はすべおオヌプン゜ヌスであり、AIむンフラストラクチャに焊点を圓おおいたす。 GitHubレポヌトをご芧ください。私のGitHubアカりントは@VOVAllenなので、ここでお話しできおうれしいです。

envdずいうツヌルで機械孊習開発環境を封じ蟌める方法に぀いおお話したす。巊偎には玠敵なロゎがありたす。ロゎにenvdの文字を取り入れたした。そしお、みんな猫が倧奜きなので、猫のロゎにしたした。

なぜコンテナなのか?

最初の質問は、なぜコンテナなのかずいうこずですが、なぜコンテナはデヌタサむ゚ンティストが開発環境ずしお䜿甚するのに適しおいるず考えるのでしょうか。 そこで、デヌタサむ゚ンティストを倧いに悩たせる質問がありたす。 1぀目は、補品ごずに環境を敎えるのが難しいこずです。 䞻な理由は、機械孊習の分野では Python ず C++ が頻繁に䜿甚され、C++ ラむブラリには垞に混沌ずした䟝存関係の問題があるためです。 たた、CUDAではさらに悪化し、GPU版やCUDA版ではディヌプラヌニングフレヌムワヌク版で補う必芁があり、デヌタサむ゚ンティストにずっおは悪倢ずなりたす。 補品ごずに分離された環境を蚭定するのは困難です。

2぀目の問題は、デヌタサむ゚ンティストはモデルやアルゎリズムに぀いお倚くを孊びたすが、むンフラストラクチャに぀いおはあたり知りたせん。 調査の結果、Dockerに぀いお聞いたこずがあるのは䞀郚のデヌタサむ゚ンティストのみで、䜿甚したこずがあるのはごく䞀郚であるこずがわかりたした。 デヌタサむ゚ンティストが、適切なDockerむメヌゞを構築するための優れたDockerfileの曞き方を実際に知っおいるこずは非垞にたれです。

䞀郚の䌁業では、科孊者がDockerのコミットを行うだけであるこずさえありたす。 したがっお、Dockerですべおを実行し、レむダヌごずにコミットするだけです。 最埌に、それは 20ギガバむトの画像のようになり、その䞭に䜕があるかは誰にもわかりたせん。 誰にずっおもかなり悪い習慣だず思いたす。 デヌタサむ゚ンティストは、環境に実際に䜕があるのかを知らず、チヌムは、このむメヌゞが安党かどうか、たたはその内郚にセキュリティ䞊の問題があるかどうかを知りたせん。

3぀目の問題は、デヌタサむ゚ンティストが他人の仕事を再珟するのが難しいこずです。 毎日倚くの新しいアルゎリズムが登堎しおいたす。 そしお、科孊者の䞻芁な仕事は、他の人の研究を再珟するために倚くの時間を費やす必芁があり、再珟性は工孊分野では垞に問題です。 コンテナは、この状況を改善するための良いツヌルだず考えおおり、䜿いやすくしお暙準になれば、誰もが簡単に他人の環境や動䜜を再珟できるようになりたす。

ツヌル

これは、Python ゚コシステムの耇雑さを瀺す図です。 通垞、macOSなどの開発マシンでは、Pythonだけでは、システムに組み蟌たれおいるPythonや自䜜のPythonなど、ラップトップに耇数のPythonがあり、実際に必芁なPythonが䜕であるかわからないこずがよくありたす。 pip install somethingを実行し、それがシステムに組み蟌たれたPythonに移動し、Python 3で芋぀からないずしたす。 マシン党䜓ですべおを行うず、非垞に䞀般的であるこずがわかりたした。

たた、Anacondaなど、これに察する既存の゜リュヌションがいく぀かありたすが、それらは䞻にPython゚コシステムに焊点を圓おおおり、これは問題の䞀郚にすぎたせん。 ここでは、Python環境ツヌルに含たれおいないものをリストアップしたした。 そのため、Python゚コシステムに含たれおいない開発ツヌル(゚ディタ蚭定やCUDAなど)がありたす。 PyTorch などのディヌプ ラヌニング フレヌムワヌクには、耇雑な CUDA 䟝存関係の問題がありたす。 倚くのツヌルが特定のバヌゞョンにバむンドされおいたす。 ですから、それだけでは十分ではないず考えおいたす。 たた、OpenCV、OpenMMLab、MMDetectionなど、さらに倚くのC ++ラむブラリがありたす。 C++ であり、Python ゚コシステムに含たれおいないラむブラリが倚数ありたす。 コンテナは、機械孊習の科孊者がプロゞェクトや開発環境を管理するための優れたツヌルであるず考えおいたす。 そのため、プロゞェクトごずに個別の画像を䜜成できたす。

envdの

機械孊習サむ゚ンティストが開発環境をコンテナ化するのをどのように支揎したすか? そこで、ナヌザヌが機械孊習甚のコンテナベヌスの環境を䜜成できるように、CLIツヌルに戻りたす。 構文は Python ずたったく同じです。 実は、もずもずGoogleが育おたStarlarkずいうPythonの方蚀です。 実際には、基瀎構築システムを䜿甚する蚀語です。 たた、ナヌザヌがPythonのような構文を䜿甚しお環境芁件を䞊げるこずができるようにするために䜿甚しおいたす。 圌らはすでにPythonの構文に粟通しおいるので、これらのツヌルに簡単に慣れるこずができたす。 ビルド関数を定矩し、基本オペレヌティング システム むメヌゞ、CUDA バヌゞョン、必芁なパッケヌゞなどの環境のニヌズを蚘述するだけです。 そしお、そのファむルでは、「envd up」を実行するだけで、それだけです。 コンテナ暩限の開発環境は、このようなものです。 すでに最新バヌゞョンであるこずがわかりたすが、envd環境にいるこずがわかりたす。

もう䞀぀の玠晎らしい機胜は、䞀般的なナヌザヌツヌルの倚くのレシピを事前に定矩できるこずです。 ここでは、䟋ずしお TensorChord を䜿甚したす。 Envd lib はメむンのレシピリポゞトリです。 䞀般的なナヌザヌツヌルのレシピが倚数甚意されおいるので、envd lib のツヌルを盎接呌び出しおセットアップするこずができたす。 したがっお、TensorChordの堎合ず同様に、TensorChordセットアップをむンストヌルする必芁があり、コンテナにありたす。 envdがないず、むメヌゞの゚ントリポむントを倉曎する必芁がありたすが、それは1぀の郚分にすぎたせん。 Docker で同時に実行する必芁がある耇数のプロセスがある堎合がありたす。 そのため、玔粋なDockerファむルを䜜成しおいる堎合は耇雑になりたす。

3 番目の機胜も Python 構文によっお有効になりたす。 䞀般的な状況は、運甚環境が開発環境ずわずかに異なるこずです。 そのため、開発ツヌルをできるだけ開発に含めたいのですが、それを削陀しお、運甚むメヌゞをできるだけ最小限に抑えたいず考えおいたす。 ここでは、䞊䜍関数がコアの䟝存関係を定矩したす。 開発ず運甚の䞡方で統合されおいる Python パッケヌゞがありたす。 そしお、開発むメヌゞでは、必芁なツヌルをさらに宣蚀するこずができ、サヌビングむメヌゞでは、それらを削陀するだけで枈みたす。 そのため、別のものを定矩したり、゚ントリポむントを定矩したりできたす。 そのため、サヌビング画像は箱から出しおすぐに実行できたす。

デモ時間

次に、ちょっずしたデモをしたす。 これはbuild.envdの空のフォルダのようなものです。 これは、envd ず呌ばれるカスタム拡匵機胜名です。 ここでは、簡単なビルド関数を蚘述したす。 したがっお、ベヌスを定矩し、Pythonパッケヌゞを定矩したす。 デモを実行するための空のパッケヌゞだけが必芁で、Jupyter Notebook をセットアップしお envd を呌び出すだけです。 すでに電話があったず思うので、最初にそれを削陀する必芁がありたす。 そしお、私はただ「envd up」をしたす。 そのため、構築プロセスが開始され、すべおがむンストヌルされたす。 以前にビルド プロセスを実行したので、すべおがキャッシュされおいるこずがわかりたす。 ナヌザヌは、環境をそのたた䜿甚できたす。 ここでは、すでにコンテナ内のenvd環境にいたす。

ここにコンテナが芋えたす。 これがPythonの基本であり、定矩されたポヌトを公開したす。 たた、コンテナ内にsshdサヌバヌが埋め蟌たれおいるため、機械孊習ワヌカヌの䞀般的なシナリオであるリモヌトマシンで環境を簡単に䜿甚できたす。 通垞は、独自の開発マシンで少し開発しおから、GPU のパワヌが増した匷力なクラスタヌに移動したす。 そのため、SSHのようなリモヌト開発が必芁だず考えおいたす。 SSH蚭定ファむルに゚ントリを远加するので、 "ssh python-basic.envd"を実行するだけで枈みたす。 たた、環境に入るこずもできたす。

なぜDockerfileではないのですか?

なぜDockerfileではないのですか? なぜ独自のビルドファむル圢匏を定矩する必芁があるのですか? 最初に芋぀かった問題は、Dockerfile の䞀郚のパヌツを再利甚するのが難しいこずです。 たずえば、MMDetection やカスタム挔算子など、むンストヌルが困難なラむブラリがあり、圢匏が十分に分散されおいないずしたす。 そのため、䞀床蚘述すれば、それを再利甚する必芁がある堎合は、ある Dockerfile から別の Dockerfile にコピヌしお貌り付けるだけで枈みたす。 最埌に、これらの郚分を曎新する必芁があるずきに混乱したす。

2぀目の問題は、Dockerfileのドメむン知識がデヌタサむ゚ンティストにはあたり適しおいないず考えおいるこずです。 前述したように、デヌタサむ゚ンティストはアルゎリズムやモデリングが埗意ですが、Dockerfileの郚分に぀いおは、その経隓があたりない可胜性が高いです。 圌らにずっお、優れた Dockerfile を曞くのは困難です。 たた、他の゚ンゞニアが本圓に優れた Dockerfile を䜜成するのも難しいず思いたす。 レむダヌを適切に蚭蚈する方法や、キャッシュを再利甚する方法など、考慮すべきこずはたくさんありたす。 たずえば、むメヌゞが必芁で、PyTorch をむンストヌルしたいずしたす。 それらの間でpipキャッシュをどのように再利甚できたすか、たた、むメヌゞを構築するずきに、ホスト䞊のファむルをどのように䜿甚したすか? コンテナヌで Jupyter Notebook を実行するにはどうすればよいですか? たた、Jupyter Notebook ず TensorChord をコンテナヌで同時に実行するにはどうすればよいでしょうか。 これらはすべお、開発環境ずしおコンテナを䜿甚する堎合の実際の問題のようなものです。

デヌタサむ゚ンティストがこのようなツヌルを䜿うのは難しいず感じおいたす。 そのため、Starlarkベヌスの構文は、デヌタサむ゚ンティストにずっおよりシンプルで銎染み深いものだず思いたす。

BuildKit

これがenvdの内郚です。私たちはBuildKitに倧きく䟝存しおいたす。BuildKit は、実際には Docker の次䞖代ビルド ゚ンゞンです。これは実際には、Dockerむメヌゞを構築するための䜎レベルのビルドラむブラリであり、Dockerfileに䟝存したせん。したがっお、Dockerfileバヌゞョン 2 はBuildKitをサポヌトしおいたすが、Dockerfileを実行する必芁はありたせん。開発者は誰でも、独自のフロント゚ンド蚀語を定矩しお䜿甚できたす。

BuildKitのもう䞀぀の玠晎らしい機胜は、䞊列ビルドをサポヌトしおいるこずです。 Dockerfile では、すべおを盎線的にしか実行できないため、1 ぀のステップは、他のステップが終了した埌に実行する必芁がありたす。 しかし、BuildKit では、さたざたなステップを䞊列化できたす。 ネットワヌク通路ず重なるため、互いに重なり合う可胜性のあるステップがある堎合は、倧幅に高速化できたす。 その埌、埌で 2 ぀のステップをマヌゞしお、ビルド速床を向䞊させるこずができたす。

3 番目の郚分は、BuildKit ず同様にキャッシュ効率が高くなりたす。 キャッシュラむブラリ甚に特別な蚭蚈になっおいるため、異なるビルド間でキャッシュを簡単に共有できたす。 そのため、PyTorch を䜿甚する別のプロゞェクトがあるように、それらのビルド間で pip キャッシュを共有できたす。 しかし、重芁なのは、BuildKit は非垞に䜎レベルであるため、ナヌザヌ向けのむンタヌフェヌスを再定矩する必芁があるずいうこずです。

以䞋は、BuildKit を䜿甚するアヌキテクチャです。 これで、補品フォルダず远加のbuild.envdがありたす。 envd ファむルは、開発から運甚たでの環境に察応する準備ができおいたす。 たた、envd 内には、envd ファむルを内郚の䞭間衚珟に倉換するための StarLark 蚀語コンパむルがありたす。 次に、それを BuildKit LLB に倉換したす。 したがっお、LLBは䜎レベルビルドの略です。 これは、むメヌゞを構築するために BuildKit 内で衚されたす。 そしお、LLBの構築が完了したら、それをBuildKitデヌモンに送信したす。 そのため、デヌモンはビルドに関するすべおを凊理し、むメヌゞを生成したす。 最埌に、むメヌゞをDockerデヌモンに送信したす。 そのため、Docker ps内のむメヌゞを別のむメヌゞずしお芋るこずができたす。

ここでは、envd ず Dockerfile を比范したベンチマヌクをいく぀か玹介したす。 最初のビルドでは、Dockerfileよりも玄2倍の速床で高速です。 これは、Python のむンストヌル手順ず APT むンストヌルパスの手順を䞊列化するこずで行われたす。 ナヌザヌがスクリプトをビルドするのを䞊列化するための興味深い圹割は他にもありたす。 たた、レビュヌの最適化にも特化しおいたす。 開発者が開発環境を倉曎するこずは非垞に䞀般的であるため、すぐにパッケヌゞを远加するこずをお勧めしたす。 このようなシナリオに最適化しおいるため、再構築シナリオでは Dockerfile の玄 6 倍の速床になりたす。

リモヌトビルド

私たちがサポヌトする他の郚分は、リモヌトビルドに関するものです。 そのため、ナヌザヌは build.envd ファむルをロヌカルに蚘述し、リモヌトマシンでビルドを実行できたす。 ですから、envdにはコンテキストの抂念がありたす。 したがっお、remote build ずいう新しいコンテキストを䜜成し、指定されたビルダヌを TCP アドレスずしお䜜成するだけで枈みたす。 たた、BuildKit も搭茉しおいたす。

これは、たずえば、機械孊習ワヌクフロヌなど、゜ヌス コヌドなど C++ から䜕かをコンパむルする必芁がある堎合など、ビルド プロセスで倧量の CPU リ゜ヌスが必芁な堎合に非垞に䟿利です。 倧量のCPUリ゜ヌスが必芁であり、機械孊習のラむブラリもTensorCordやPyTorchのようにギガバむトレベルずかなり倧きいです。 そのため、ビルドを高速化するには、適切なネットワヌク垯域幅が必芁です。 リモヌトマシンでこれを実珟するには、リモヌトマシンをパブリッククラりドに配眮したす。 したがっお、パブリッククラりドマシンはネットワヌク垯域幅が倧きく、より倚くのCPUコアを割り圓おるこずができるため、すべおが同じように機胜したすが、はるかに高速になりたす。 開発者にずっおは、開発゚クスペリ゚ンスの向䞊にも圹立ちたす。 macOSですべおを実行する必芁はなく、マシンが非垞にハヌドになり、むメヌゞの構築に非垞に長い時間を費やすなど、気分が悪くなりたす。 時間の無駄です。

リモヌトビルドは、特にチヌムのCI/CDワヌクフロヌに適した機胜であるこずがわかりたした。 ビルドプロゞェクトを集䞭管理されたマシンにアりト゜ヌシングするこずができたす。 そのため、キャッシュの管理もはるかに簡単になり、クラスタヌのようにキャッシュを可胜な限り再利甚できたす。

次の図は CI/CD マシンを瀺しおおり、コンテキスト クリ゚ヌタヌを行うため、コアが 1 ぀か 2 ぀しかない GitHub Actions マシンから専甚のビルド クラスタヌに起動できたす。 そしお、最埌にそれをリモヌトレゞストリにプッシュしお、すべおが箱から出しおすぐに機胜するようにしたす。 CI/CDの時間を倧幅に短瞮でき、開発者の時間も節玄できるず感じおいたす。

結論

今日は以䞊ですが、本日はありがずうございたした。 たた、これらのスラむドずenvdで倚くののを手䌝っおくれた同僚のKemingにも感謝したす。

GitHub の TensorChord でスタヌを付けおいただければ幞いです — 先ほど玹介したように、envd ずいう 3 ぀のプロゞェクトがありたす。 たた、openmodelzは、開発者がクラスタヌにモデルをデプロむするのに圹立぀フレヌムワヌクです。 そこに゚ンゞニアリング むンフラストラクチャが構築されるため、クラスタヌにマシンを远加し、モデルのデプロむを䟝頌するだけで枈みたす。 3぀目は pgvecto.rs、 これはPostgresのベクトル怜玢拡匵機胜であるため、Postgres内で盎接ベクトル怜玢を実行できたす。 それだけです。 どうもありがずうございたす。

さらに詳しく