nvidia-docker2.0 は、主に docker の設定ファイル「/etc/docker/daemon.json」を変更することで、docker が NVIDIA Container ランタイムを使用できるようにするシンプルなパッケージです。
この記事の動作環境: Windows 10 システム、Docker バージョン 20.10.11、Dell G3 コンピューター。
NVidia Docker の紹介
NVIDIA は、NVIDIA GPU を使用したコンテナーを容易にするために、2016 年に NVIDIA-Docker の設計を開始しました。第 1 世代の nvidia-docker1.0 は、Docker クライアントのカプセル化を実装し、コンテナーの起動時に必要な GPU デバイスとライブラリをコンテナーにマウントします。ただし、この設計方法は Docker ランタイムと高度に連携しているため、柔軟性に欠けます。既存の欠陥は次のとおりです。
この設計は Docker と高度に結合しており、他のコンテナー ランタイムをサポートしていません。例: LXC、CRI-O、将来追加される可能性のあるコンテナ ランタイム。
Docker エコシステム内の他のツールを有効に活用できません。例: docker compose。
GPU は、柔軟なスケジューリングのためのスケジューリング システムのリソースとして使用できません。
コンテナ実行時の GPU サポートを改善します。例: ユーザーレベルの NVIDIA ドライバー ライブラリ、NVIDIA カーネル モジュール、デバイスの順序などを自動的に取得します。
上記の欠点に基づいて、NVIDIA は次世代コンテナ ランタイム nvidia-docker2.0 の設計を開始しました。
nvidia-docker 2.0 の実装メカニズム
まず、nvidia-docker 2.0、containerd、nvidia-container-runtime、libnvidia-container との直接の関係を簡単に紹介します。ランク。
これらの関係は、次の図で関連付けることができます:
nvidia-docker 2.0
nvidia -docker2.0 は、主に docker 構成ファイル /etc/docker/daemon.json を変更することで docker が NVIDIA コンテナー ランタイムを使用できるようにするシンプルなパッケージです。
nvidia-container-runtime
nvidia-container-runtime は実際のコア部分で、元の Docker コンテナー ランタイム runc に基づいて事前起動を追加します。フック、使用されます。 libnvidia-container ライブラリを呼び出します。
libnvidia-container
libnvidia-container は、Linux コンテナーで使用される NVIDIA GPU を作成するために使用できるライブラリとシンプルな CLI ツールを提供します。
Containerd
Containerd は主に次のことを担当します:
コンテナのライフ サイクルの管理 (コンテナの作成から破棄まで) )
containerd の場合 リクエストを受信したら、関連する準備を行います。runc を自分で呼び出すか、containerd-shim を作成して runc を呼び出すかを選択できます。Runc は、OCI ファイルに基づいてコンテナを作成します。以上が通常のコンテナ作成の基本的な流れです。
RunCRunC は軽量ツールです。コンテナを実行するために使用されます。これは 1 つのことと 1 つのことを実行するためにのみ使用されます。適切に実行してください。これは、Docker エンジンを経由せずにコンテナを直接実行できるコマンド ライン ガジェットと考えることができます。実際、runC は標準化の産物であり、OCI 標準に従ってコンテナを作成および実行します。 OCI (Open Container Initiative) 組織は、コンテナ形式とランタイムに関するオープンな業界標準を開発することを目的としています。
RunC コマンド ラインを使用してコンテナを直接作成し、簡単な対話機能を提供できます。
各コンポーネントの機能とコンポーネント間の関係を紹介しました。次に、この図を詳しく説明します:
通常どおりコンテナを作成します。
docker --> dockerd --> containerd--> containerd-shim -->runc --> container-process
docker クライアントは、コンテナ作成リクエストを dockerd に送信します。 dockerd がリクエストタスクを受信すると、そのリクエストを containerd に送信します。 チェックと検証の後、containerd は、containerd-shim を起動します。コンテナプロセスを開始します。
GPU を使用するコンテナーの作成GPU コンテナーを作成するプロセスは次のとおりです。
docker--> dockerd --> containerd --> containerd-shim--> nvidia-container-runtime --> nvidia-container-runtime-hook --> libnvidia-container --> runc -- > container-process
基本的なプロセスは次のプロセスと似ています。 GPU を使用しないコンテナー。ただし、docker のデフォルトのランタイムは、NVIDIA 独自の nvidia-container-runtime に置き換えられます。
このように、nvidia-container-runtime はコンテナを作成するときに、まず nvidia-container-runtime-hook フックを実行して、コンテナが GPU を使用する必要があるかどうかを確認します (環境変数 NVIDIA_VISIBLE_DEVICES によって判断されます)。 。必要に応じて、libnvidia-container を呼び出して GPU をコンテナーに公開します。それ以外の場合は、デフォルトの runc ロジックが使用されます。
そういえば、nvidia-docker2.0 の一般的な仕組みは基本的に明らかです。ただし、nvidia-container-runtime、libnvidia-container、containerd、および runc に関連するプロジェクトについては、この記事では 1 つずつ紹介しません。興味があれば、自分で調べて学ぶことができます。これらのプロジェクトのアドレスは記事内でリンクされています。
推奨学習: 「Docker ビデオ チュートリアル 」
以上がNvidia docker2とは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。