WSL 2でのCUDAサポートの登場について

マイクロソフトは、2020年5月にビルドカンファレンスで発表されたユーザーからの多数の要求に応えて、Linux 2 用のWindowsサブシステム(Linux 2 用のWindowsサブシステム、WSL 2)の新機能-ビデオアクセラレータのサポートを発表しました。これにより、WSL 2でアドホックコンピューティングアプリケーションを実行できます。 GPUサポートは、専門的なツールへの道を開き、現在Linuxでのみ可能であるWSL 2のタスクの解決に役立ちます。これで、GPUの機能を使用して、Windowsで同様のタスクを解決できます。



ここで、WSLがNVIDIA CUDAハードウェアおよびソフトウェア並列コンピューティングアーキテクチャのサポートを備えていることが非常に重要です



私たちが公開している資料は、NVIDIAの専門家によって翻訳されています。ここでは、WSL 2パブリックプレビューでCUDAに期待することについて説明します。





WSL 2コンテナーでのLinux AIフレームワークの実行



WSLとは何ですか?



WSLはWindows 10の機能であり、デュアルブート構成を適用する複雑さに対処する必要なく、WindowsでLinuxコマンドラインツールを直接使用できます。WSLは、Microsoft Windowsと緊密に統合されたコンテナ化された環境です。これにより、Linuxアプリケーションは、Microsoft Storeを通じて配布される従来のWindowsアプリケーションおよび最新のアプリケーションと一緒に実行できます。



WSLは主に開発者向けのツールです。 Linuxコンテナでいくつかのプロジェクトに取り組んでいる場合、Windowsコンピュータで、使い慣れたLinuxツールを使用して、ローカルで同じことを実行できることを意味します。通常、このようなアプリケーションをWindowsで実行するには、システムの構成に長い時間を費やす必要があり、サードパーティのフレームワーク、ライブラリが必要です。現在、WSL 2のリリースにより、すべてが変更されました。 WSL 2のおかげで、Linuxカーネルの完全なサポートがWindowsの世界にもたらされました。



WSL 2とGPU準仮想化テクノロジ(GPU-PV)により、マイクロソフトはWindowsのLinuxサポートを新たなレベルに引き上げ、GPUベースのコンピューティングロードを実行できるようにしました。以下では、WSL 2でのGPUの使用方法について詳しく説明します。



WSL 2でのビデオアクセラレータのサポートのトピックに興味がある場合は、この資料とこのリポジトリをご覧ください。



CUDAからWSL



WSL 2のGPU機能を利用するには、Microsoft WDDMをサポートするビデオドライバーをコンピューターにインストールする必要があります。このようなドライバーは、NVIDIAなどのビデオカードメーカーによって作成されます。



CUDAテクノロジにより、NVIDIAビデオアクセラレータ用のプログラムを開発できます。このテクノロジーは、WindowsのWDDMで長年サポートされています。 Microsoftの新しいWSL 2コンテナーは、CUDAテクノロジーが利用できるGPU高速化コンピューティング機能を提供し、CUDAベースのプログラムをWSL環境で実行できるようにします。詳細については、「WSL CUDA ユーザーガイド」を参照してください



WSLでのCUDAサポートは、WDDM 2.9のNVIDIAドライバーに含まれています。これらのドライバーはWindowsに簡単にインストールできます。 WSLのCUDAユーザーモードドライバー(libcuda.so)は、コンテナー内で自動的に使用可能になり、ローダーで検出できます。



NVIDIAドライバー開発チームは、CUDAドライバーにWDDMおよびGPU-PVサポートを追加しました。これは、これらのドライバーがWindowsで実行されているLinux環境で機能するようにするためです。これらのドライバーはまだプレビューステータスであり、GPUをサポートする公式のWSLリリースが行われた場合にのみリリースが行われます。ドライバーリリースの詳細については、こちらをご覧ください



次の図は、Linuxゲスト内でCUDAドライバーをWDDMに接続する方法の図を示しています。





Linuxゲストで実行されているCUDA対応のユーザーモードWDDMドライバー



あなたが Fast Ring(ビルド20149以前)からの最新のWindowsビルドMicrosoft Windows Insider Program(WIP)にWSLディストリビューションをインストールした開発者であるとします。 WSL 2に切り替えてNVIDIA GPUを使用している場合は、ドライバーをテストして、GSLコンピューティングコードをWSL 2で実行できます。これを行うには、Windowsホストシステムにドライバーをインストールして、WSLコンテナーを開きます。ここでは、追加の作業なしで、CUDAを使用するアプリケーションを操作する機会があります。次の図は、CUDA機能を使用するTensorFlowアプリケーションがWSL 2コンテナでどのように実行されているかを示しています。





WSL 2で実行されるTensorFlowコンテナー



WSLがWSLで使用できるようになったという事実により、CUDAは、以前は通常のLinux環境でしか実行できなかったアプリケーションを実行できます。



NVIDIAはまだこのプロジェクトに積極的に取り組んでおり、改善を行っています。特に、以前はLinux専用に設計されていたWDDM APIの追加に取り組んでいます。これにより、WSLでは、ユーザー側で追加の作業を行わなくても、より多くのアプリケーションが機能するようになります。



私たちにとって興味深いもう1つの問題はパフォーマンスです。前述のように、WSL 2のGPUサポートはGPU-PVテクノロジーを真剣に受け止めています。これは、パイプライン処理が使用されない状況で、GPUで小さなタスクを実行する速度に悪影響を与える可能性があります。現在、これらの影響を可能な限り減らすよう取り組んでいます。



NVML



NVMLテクノロジーは元のドライバーパッケージに含まれていません。修正を試みており、NVMLのサポートとWSLの他のライブラリのサポートを追加する予定です。



CUDAサポートがWSLに追加された初期の段階でも、既存のCUDAアプリケーションのほとんどを実行できるメインCUDAドライバーから始めました。しかし、結局のところ、一部のコンテナーおよびアプリケーションは、CUDAをロードする前でも、NVMLを使用してGPU情報を取得しています。これが、WSLにNVMLサポートを追加することが私たちの最優先事項の1つである理由です。間もなく、この問題の解決についていくつかの良いニュースを共有できるようになるでしょう。



WSLのGPUコンテナー



DirectXおよびCUDAのWSL 2サポートに加えて、NVIDIAは、NVIDIA Container Toolkit(以前はnvidia-docker2と呼ばれていました)のサポートをWSL 2に追加するように取り組んでいます。データサイエンティストがオンプレミスまたはクラウドで実行するために構築したコンテナー化されたGPUアプリケーションは、変更することなく、Windowsコンピューター上のWSL 2で実行できるようになりました。



これには特別なWSLパッケージは必要ありません。 NVIDIAランタイムライブラリ(libnvidia-container)は、libdxcoreを動的に検出し、GPUアクセラレーションWSL 2環境でコードが実行されているときにそれを使用できます。これは、Linuxと同様に、DockerおよびNVIDIA Container Toolkitパッケージをインストールした後に自動的に行われます。これにより、追加の作業なしに、GPUの能力を使用するWSL 2でコンテナーを実行できます。



このオプションを使用する場合--gpusは、Dockerツールの最新バージョン(19.03以降)をインストールすることを強くお勧めします。 WSL 2のサポートを有効にするには、Linuxディストリビューション指示に従い、入手可能な最新バージョンをインストールしますnvidia-container-toolkit



使い方? WSL 2に固有のすべてのタスクは、libnvidia-containerライブラリを使用して解決さます。これで、このライブラリは実行時にlibdxcore.soの存在を検出し、このライブラリを使用して、このインターフェイスに表示されるすべてのGPUを検出できます。



コンテナーでこれらのGPUを使用する必要がある場合は、libdxcore.soを使用して、WindowsホストシステムとWSL 2のすべてのドライバーライブラリを含むフォルダーであるドライバーストレージの場所にアクセスします。libnvidia-container.soライブラリは、コンテナーの構成を担当しますドライバーリポジトリに正しくアクセスできるようにします。これと同じライブラリが、WSL 2でサポートされる基本ライブラリの構成を担当します。これを次の図に概略的に示します。





WSL 2でlibnvidia-container.soによって使用されるドライバーリポジトリコンテナーを検出およびマッピングするためのスキーム



また、これはWSLの外部で使用されるロジックとは異なります。このプロセスはlibnvidia-container.soで完全に抽象化されており、エンドユーザーに対してできるだけ透過的である必要があります。この初期バージョンの制限の1つは、複数のGPUが存在する環境ではGPUを選択できないことです。すべてのGPUは常にコンテナーに表示されます。



すでにおなじみのNVIDIA Linuxコンテナーは、WSLコンテナーで実行できます。 NVIDIAは、専門家が使用する最もエキサイティングなLinux固有のツールとワークフローをサポートしています。 NVIDIA NGCから興味のあるコンテナをダウンロードして試してください。



次に、NVIDIA GPUを使用してコンピューティングを高速化するように設計されたWSL 2でTensorFlowおよびN-bodyコンテナを実行する方法について説明します。



N-bodyコンテナーの実行 



インストールスクリプトを使用してDockerをインストールします。



user@PCName:/mnt/c$ curl https://get.docker.com | sh


NVIDIA Container Toolkitをインストールします。WSL 2のサポートは、nvidia-docker2 v2.3およびlibnvidia-container 1.2.0-rc.1ランタイムライブラリから利用できます。



リポジトリstableexperimentalGPGキーを設定します。WSL 2をサポートするためのランタイムコードの変更は、実験的リポジトリで利用できます。



user@PCName:/mnt/c$ distribution=$(. /etc/os-release;echo $ID$VERSION_ID)

user@PCName:/mnt/c$ curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -

user@PCName:/mnt/c$ curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list

user@PCName:/mnt/c$ curl -s -L https://nvidia.github.io/libnvidia-container/experimental/$distribution/libnvidia-container-experimental.list | sudo tee /etc/apt/sources.list.d/libnvidia-container-experimental.list


NVIDIAランタイムパッケージとその依存関係をインストールします。



user@PCName:/mnt/c$ sudo apt-get update
user@PCName:/mnt/c$ sudo apt-get install -y nvidia-docker2


WSLコンテナーを開き、その中でDockerデーモンを実行します。すべてが正しく行われると、その後、サービスメッセージが表示されますdockerd



user@PCName:/mnt/c$ sudo dockerd




Dockerデーモンの開始



別のWSLウィンドウで、N-bodyシミュレーションコンテナーをロードして開始します。このタスクを実行するユーザーには、コンテナーをロードするための十分な権限が必要です。以下のコマンドは、sudoを使用して実行する必要がある場合があります。出力では、GPUに関する情報を確認できます。



user@PCName:/mnt/c$ docker run --gpus all nvcr.io/nvidia/k8s/cuda-sample:nbody nbody -gpu -benchmark




Nボディコンテナを起動



TensorFlowコンテナを実行する



WSL 2環境のDockerで試してみましょう。もう1つの一般的なコンテナであるTensorFlowです。



TensorFlow Dockerイメージをダウンロードします。Dockerへの接続の問題を回避するには、sudoモードで次のコマンドを実行します。



user@PCName:/mnt/c$ docker pull tensorflow/tensorflow:latest-gpu-py3


TensorFlowチュートリアル15から 少し変更したバージョンのGPU チュートリアルCホストシステムのディスクに保存しましょうこのディスクは、デフォルトではとしてWSL 2コンテナーにマウントされます/mnt/c



user@PCName:/mnt/c$ vi ./matmul.py
import sys
import numpy as np
import tensorflow as tf
from datetime import datetime

device_name = sys.argv[1]  # Choose device from cmd line. Options: gpu or cpu
shape = (int(sys.argv[2]), int(sys.argv[2]))
if device_name == "gpu":
    device_name = "/gpu:0"
else:
    device_name = "/cpu:0"

tf.compat.v1.disable_eager_execution()
with tf.device(device_name):
    random_matrix = tf.random.uniform(shape=shape, minval=0, maxval=1)
    dot_operation = tf.matmul(random_matrix, tf.transpose(random_matrix))
    sum_operation = tf.reduce_sum(dot_operation)

startTime = datetime.now()
with tf.compat.v1.Session(config=tf.compat.v1.ConfigProto(log_device_placement=True)) as session:
        result = session.run(sum_operation)
        print(result)

#  
print("Shape:", shape, "Device:", device_name)
print("Time taken:", datetime.now() - startTime)


以下は、コンテナにマウントされたディスクからこのスクリプトを実行した結果を示していますCスクリプトは、最初にGPUを使用して実行され、次にCPUを使用して実行されました。便宜上、ここの出力は削減されています。



user@PCName:/mnt/c$ docker run --runtime=nvidia --rm -ti -v "${PWD}:/mnt/c" tensorflow/tensorflow:latest-gpu-jupyter python /mnt/c/matmul.py gpu 20000




matmul.pyスクリプトの実行結果



WSL 2コンテナーでGPUを使用すると、CPUでの実行と比較して、コード実行が大幅に高速化されます。



GPUコンピューティングのパフォーマンスを研究するために設計された別の実験を行ってみましょう。これは、Jupyter Notebookマニュアルのコードです。コンテナを起動すると、Jupyter Notebookサーバーへのリンクが表示されます。



user@PCName:/mnt/c$ docker run -it --gpus all -p 8888:8888 tensorflow/tensorflow:latest-gpu-py3-jupyter




Jupyter Notebookの



実行これで、Jupyter Notebook環境でデモを実行できるようになります。 Microsoft Edgeブラウザを使用してJupyter Notebookに接続するには、127.0.0.1ではなくを使用する必要があることに注意してくださいlocalhost



に移動しtensorflow-tutorials、メモ帳を起動しclassification.ipynbます。



GPUアクセラレーションの結果を確認するには、メニューに移動し、WSL 2 Jupyter NotebookコンテナーでログをCell選択Run Allして表示します。





Jupyter Notebook Magazine



このデモおよびこのコンテナの他のいくつかでは、小さなタスクを解決するときにシステムに不当に高い追加の負荷がかかることに関連する仮想化レイヤーの問題を確認できます。これについては、すでに上記で説明しました。ここでは非常に小さなトレーニングモデルを起動しているため、GPUでの実行時間は、同期の問題を解決するために必要な時間よりも短くなります。WSL 2でこのような「おもちゃ」のタスクを解決する場合、CPUはGPUよりも効率的です。私たちはこの問題の解決に取り組んでおり、パイプライン化が適用されていない非常に小さなワークロードのみにその症状を制限するよう努めています。



WSLの概要



WSL 2にGPUサポートがどのように追加されたかを理解するために、WindowsでのLinuxの起動とは何か、コンテナがハードウェアをどのように認識するかについて説明します。



マイクロソフトは2016年のビルドでWSLテクノロジを導入しました。このテクノロジーはすぐに幅広いアプリケーションを見つけ、OfficeなどのWindowsベースのアプリケーションをLinuxと関連プログラムの開発ツールとともに実行する必要があるLinux開発者の間で人気を博しました。



WSL 1では、変更されていないLinux実行可能ファイルを実行できました。ただし、NTカーネルサブシステムとして実装されたLinuxカーネルエミュレーションレイヤーを使用していました。このサブシステムは、Linuxアプリケーションからの呼び出しを処理し、適切なWindows 10メカニズムにリダイレクトしました。



WSL 1は便利なツールでしたが、すべてのLinuxシステムコールを完全にエミュレートする必要があったため、すべてのLinuxアプリケーションと互換性がありませんでした。さらに、ファイルシステムの動作が遅いため、一部のアプリケーションのパフォーマンスが許容できないほど低くなっていました。



これを念頭に置いて、マイクロソフトは別の方法を選択し、WSLの新バージョンであるWSL 2をリリースしました。 WSL 2コンテナーは、仮想化環境で完全なLinuxディストリビューションを実行しますが、新しいWindows 10コンテナー化システムを十分に活用します。



WSL 2はWindows 10 Hyper-Vサービスを使用しますが、従来の仮想マシンではなく、軽量のヘルパー仮想化エンジンです。このメカニズムは、物理メモリに関連付けられた仮想メモリを管理し、WSL 2コンテナがWindowsホストシステムにアクセスしてメモリを動的に割り当てることを可能にします。



WSL 2を作成する主な目的の1つは、ファイルシステムでの作業のパフォーマンスを向上させ、すべてのシステムコールとの互換性を確保することです。さらに、WSL 2は、WSLとWindowsの統合レベルを向上させるために作成されました。これにより、Windowsコマンドラインツールを使用して、コンテナーで実行されているLinuxシステムを簡単に操作できます。これにより、コンテナファイルシステムの選択したディレクトリに自動的にマウントされるホストファイルシステムの使いやすさが向上します。



WSL 2は、プレビュー機能としてWindows Insider Programで導入され、バージョン2004のWindows 10の最新のアップデートでリリースされました。



Windowsの最新バージョンであるWSL 2には、ネットワークスタックから基本的なVHDストレージエンジンまですべてに影響を与える、さらに多くの拡張機能があります。WSL 2のすべての新機能の説明は、この資料の範囲を超えています。WSL 2とWSL 1を比較するこのページで、それらの詳細を学ぶことができます



LinuxコアWSL 2



WSL 2で使用されるLinuxカーネルは、kernel.orgで入手可能なソースコードを使用して、最新の安定版ブランチに基づいてMicrosoftによってコンパイルされました。このカーネルはWSL 2用に特別に調整されており、サイズとパフォーマンスの点で最適化されており、LinuxがWindowsで確実に実行されます。カーネルは、Windows Updateメカニズムを通じてサポートされます。これは、ユーザーが最新のセキュリティ更新やカーネルの改善をダウンロードすることを心配する必要がないことを意味します。これはすべて自動的に行われます。



MicrosoftはWSLでいくつかのLinuxディストリビューションをサポートしています。同社は、オープンソースコミュニティのルールに従って、Windows 10との統合に必要な変更を加えたWSL 2カーネルのソースコードをWSL2 -Linux-Kernel GitHubリポジトリに公開しました。 



WSLでのGPUサポート



Microsoft開発者は、WSL 2コンテナーのGPU-PVテクノロジーを使用した実際のGPUのサポートを追加しました。ここで、オペレーティングシステムのグラフィックコア(dxgkrnl)は、ゲスト仮想マシンで実行されているユーザーモードコンポーネントからホストのカーネルモードドライバーへの呼び出しをマーシャリングします。



マイクロソフトはこのテクノロジーをWDDM機能として開発しました。その開始以来、Windowsにはいくつかのリリースがありました。この作業は、独立系ハードウェアベンダー(独立系ハードウェアベンダー、IHV)の支援を得て実施されました。 NVIDIAグラフィックスドライバーは、このテクノロジーの初期の頃から、Windows Insider Programで利用可能な製品のプレビューバージョンでGPU-PVをサポートしてきました。現在サポートされているすべてのNVIDIA GPUには、Hyper-Vを実行している仮想マシンのゲストモードで実行しているWindows OSからアクセスできます。



WSL 2のGPU-PV機能を利用するために、マイクロソフトはLinuxゲスト用のグラフィックフレームワークのベースであるGPU-PVプロトコルをサポートするWDDMを作成する必要がありました。新しいMicrosoftドライバーは、LinuxでWDDMをサポートするシステムであるdxgkrnlの背後にあります。ドライバーコードはWSL2-Linux-Kernelリポジトリにあります。



Dxgkrnlは、WDDM 2.9のWSL 2コンテナーでGPUアクセラレーションサポートを提供する予定です。 Microsoftは、dxgkrnlはGPU-PVプロトコルに基づくLinux GPUドライバーであり、同様の名前のWindowsドライバーとは関係がないと述べています。



現在、NVIDIA WDDM 2.9ドライバーのプレビューバージョンをダウンロードできます。今後数か月間、このドライバはWIPバージョンのWindowsのWindows Updateを介して配布されるため、手動でのドライバのダウンロードとインストールは不要になります。



GPU-PVの基本



dxgkrnlドライバーは、Linuxゲストシステムのユーザーモードで、新しいデバイス/ dev / dxgを使用可能にします。Windowsで利用可能だったD3DKMTカーネルサービスレイヤーも、dxcoreライブラリの一部としてLinuxに移植されました。一連のプライベートIOCTL呼び出しを使用してdxgkrnlと対話します。



Linuxゲストバージョンのdxgkrnlは、複数のVMバスチャネルを使用してWindowsホスト上のdxgカーネルに接続します。ホスト上のdxgカーネルは、WDDMを使用する通常のWindowsアプリケーションからのものと同じ方法でLinuxプロセスからのものを処理します。つまり、dxgカーネルは受け取ったものをKMD(カーネルモードドライバー、すべてのHIVに固有のカーネルモードドライバー)に送信します。カーネルモードドライバーは、ハードウェアGPUに送信するために受信したものを準備します。次の図は、Linuxデバイス/ dev / dxgとKMDの間の相互作用の簡略図を示しています。





WindowsホストコンポーネントがどのようにLinuxゲストでdxgデバイスを機能させるかを示す簡単な図



Windowsゲストでこの種の動作を提供することになると、NVIDIAドライバーはかなり前からWindows 10でGPU-PVをサポートしています。NVIDIA GPUを使用すると、Microsoft仮想化レイヤーを使用するすべてのWindows 10アプリケーションでコンピューティングとグラフィックスの出力を高速化できます。GPU-PVを使用すると、vGPUでの作業も可能になります。次に、同様のアプリケーションの例をいくつか示します。





NVIDIA GeForce GTX 1070ビデオアクセラレータを使用して、WindowsサンドボックスコンテナーでDirectXアプリケーションを起動する方法を次に示します。





Windowsサンドボックスコンテナのグラフィックアクセラレーションは、NVIDIA GeForce GTX 1070によって実行されます



ユーザーモードのサポート



WSLにグラフィックレンダリングのサポートを追加するために、Microsoftの対応する開発チームもdxcoreユーザーモードコンポーネントをLinuxに移植しました。



dxcoreライブラリは、システムで使用可能なWDDM互換のグラフィックスカードに関する情報を取得できるAPIを提供します。このライブラリは、WindowsおよびLinux上のDXGIアダプターツールのクロスプラットフォームの低レベルの代替品として考えられました。ライブラリはまた、CUDAおよびWSL WDDMサポートに依存するその他のユーザーモードコンポーネントによって使用されるD3DKMT APIレイヤーを使用して、dxgkrnlサービス(LinuxではIOCTL呼び出し、WindowsではGDI呼び出し)へのアクセスを抽象化します。



Microsoftによると、dxcoreライブラリ(libdxcore.so)はWindowsとLinuxの両方で利用できるようになるという。NVIDIAは、DirectX 12サポートとCUDA APIをドライバーに追加する予定です。これらのアドオンは、WDDM 2.9で利用可能な新しいWSL機能を対象としています。両方のAPIライブラリがdxcoreに接続されるため、ホストシステム上のKMDへのリクエストをマーシャリングするようにdxgに指示できます。



WSL 2の新機能をお試しください



Windowsコンピューターを使用して、機械学習および人工知能の分野からの実際の問題を解決し、同時にLinux環境のすべての設備を使用しますか?もしそうなら、WSLのCUDAサポートは、まさにそれを行う素晴らしい機会をあなたに与えます。WSL環境は、CUDA Dockerコンテナーがデータサイエンティストの間で最も人気のあるコンピューティング環境であることが証明されている場所です。





ここでは、WSLでのCUDAテクノロジーの使用について詳しく学ぶことができます。こちらのCUDAおよびWSLフォーラムでは、これらのテクノロジーに関する印象、見解、アイデアを私たちと共有できます。



WSL 2でCUDAを試したことはありますか?






All Articles