Google Colaboratory で TensorRT を使って機械学習の推論を爆速化してみる【環境構築編(tar版)】

この記事では、Google Colaboratory上でTensorRTを利用できる環境を構築します。NVIDIA公式サイトからリポジトリをダウンロードし、TensorRTのパッケージをインストール、サンプルプログラムの実行までの流れを説明しています。

はじめに

本記事は、主に以下のような方を対象としています。

jupyter notebookの基本的な操作がわかる方
機械学習のプログラムを作成したことがある方
環境構築でGPUプログラミングに躓いてしまった方
機械学習推論の高速化を通してGPUプログラミングを学んでみたい方

TensorRTを使うと、機械学習(AI)利用にかかる時間的なコストを大幅に削減することが出来ます。通常だとGPU環境を用意する必要があり、個人では試しにくい技術です。しかし、今回はGoogle社の提供するGoogle Colaboratoryを用いることで、個人でも非常に簡単に試せる環境を作り上げます。
TensorRTについては、以下の動画で紹介されています。

出典:NVIDIA公式サイト

自身で作成した機械学習を用いたプログラムがどのくらい早くなるのか、一緒に試してみませんか?
今回の記事は環境構築編ということで、実際に機械学習で推論を行うところまでは説明しません。実践編の記事は後日リリース予定です。

面倒なイメージのある環境構築部分ですが、とても簡単に出来るのでぜひ通読してみてください。また、記事内ではLinuxのコマンドを利用していますが、一つ一つのコマンドに関してその都度解説を入れています。あまりコマンドラインを利用したことがない方でも簡単に試せるようになっています。

Google Colaboratoryとは

無料でブラウザ上でPythonプログラムを実行可能なサービスで、実行環境(ランタイム)にはGPUを選ぶことも出来ます。
Pythonを使って機械学習を試したり、GPUプログラミングを試したりするには用意するものが少なく、とても敷居が低いです。
AWSなどに比べて自分で環境構築をする必要はほとんど無いですし、変なところに触って料金が発生してしまうという心配もありません。
しかも、Googleアカウントを持っていればすぐに利用開始できます。

Google Colaboratoryの起動

他のGoogleドキュメントやGoogleスプレッドシートなどのように、Google提供アプリケーション内にあります。

なお、今回作成したノートブックは以下のGistにアップロードしています。一部記事のコードと異なる部分もありますが、適宜ご参照下さい。

新規ノートブックの作成

上記のリンクからアクセスすると、Welcomeページが表示されるはずです。

今回は1からノートブックを作っていきます。左上のファイル→ノートブックを新規作成をクリックします。

画像1

ここで作成されたノートブックはアカウントに紐付いたGoogleドライブ上に保存されます。

画像2

新規ノートブックを作成できました。ここにPythonでコーディングすると、すぐにプログラムが実行でき、jupyter notebookと同じように使えます。

OS & GPUの確認・GPUへの接続

それでは本題の環境構築を行っていきましょう。
ノートブック上では、Pythonのコード以外にもLinuxコマンドを実行することが出来ます。コマンドの先頭に!を付け、通常のLinuxコマンドと同様にOSのバージョン、そして今回はGPUの情報も参照してみましょう。​

画像3

すると上の画像のような出力が出てきます。OSがUbuntu 18.04.5のLTSであることは分かりましたが、GPUの情報が上手く参照出来ていないようです。
これはまだGoogle Colaboratory上でGPUのランタイムに接続していないことが原因です。以下の通りに設定を変更して、GPUに接続しましょう。

上部メニュー>ランタイム>ランタイムのタイプを変更

画像4

ハードウェアアクセラレータ>GPU
→保存

画像5

これで、GPUのランタイムに接続できるようになりました。それでは、もう一度先程のコードセルを実行してみましょう。

画像6

すると、今度はGPUの利用状況が出てきたはずです。このように、GPUを利用する際はランタイムのタイプ変更を行わなければなりません。

続いて、以下のコードを用いてOS、CUDAバージョンの確認を行いましょう。

!cat /etc/issue
!python -V
!nvcc -V
!dpkg -l | grep "cudnn"

画像12

上から順に、OSのバージョン、CUDAのバージョン、pythonのバージョン、cuDNNのバージョンを表示させます。画像の状態であれば、Ubuntu18.04.5、CUDA=11.0、Python=3.7.10、dpkgの結果としてhi(hold installed)ステータスになっているcuDNN=8.0.4と確認できます。それぞれのバージョン情報は後々パッケージをインストールする際に利用するので、チェックするようにしてください。

Google Colaboratory上では実行環境のGPUがランダムに変化します。CUDAバージョンやOSがランダムに変わることはありませんが、毎回チェックしておくと良いでしょう。こちらの情報は後ほどパッケージをインストールする際に必要な情報なので、覚えておきます。

【補足】
CUDAとは、NVIDIAが開発・提供している、GPUに関する開発時に利用する汎用的プラットフォームのことです。CUDAを介してコンパイラやAPIの提供を行っています。

TensorRTのダウンロード

NVIDIA公式HPからダウンロードします。ダウンロードにはNVIDIA Developer Programへの参加が必要のため、アカウントを作成した上で必要事項を記入してください。最終的には以下のようなページにたどり着きます。

画像8

規約に同意すると、TensorRTのバージョン一覧が表示されます。今回は実行環境のCUDAバージョンが11.0だったため、対応バージョンのTensorRTを導入します。
この記事ではTensorRT 7.xを導入していきます。

画像7

先程調べたOS、CUDA、cuDNNのバージョンに一致するtarファイルをダウンロードします。

画像12

本記事上でダウンロードしたものは、TensorRT 7.2.2、Ubuntu18.04、CUDA11.0、cuDNN8.0用のtar packageファイルになります。

【補足】
今回の記事では記載しませんが、もし最新版のTensorRT(執筆時点では8.x)をインストールしたい場合はGoogle ColaboratoryのCUDA、cuDNNバージョンを変更する必要があります。

Google Colaboratory上にアップロード

ダウンロードしたファイルをGoogle Colaboratory上で扱えるよう、アップロードする必要があります。ただし、Google Colaboratory上でそのままアップロードすると、先程のファイルサイズは1GBほどあるため、アップロード時間が非常に長くなってしまいます。TensorRT実装時に毎回時間がかかってしまっては困るため、Google Colaboratory上で実装する場合は、以下のような方法で対処します。

・自身のGoogleドライブにファイルをアップロードしておき、ドライブをColaboratoryにマウントする。
・DropboxやOnedriveなど、クラウド上で参照できる場所に配置し、wgetでファイルをGoogle Colaboratory内にダウンロードする。

今回は今後ファイルを追加することも考え、Googleドライブを利用する手順を紹介します。Googleドライブ上にアップロードし、ドライブをColaboratory上にマウントした上でtar packageファイルを利用します。

詳細な方法は本記事上では省略しますが、下記ノートブックの「Google ドライブをローカルにマウントする」をご参照ください。

下のコードブロックを追加・実行し、認証を行います。

from google.colab import drive
drive.mount('/content/drive')

本記事では、Googleドライブ直下にTensorRTというフォルダを作成し、そのフォルダ内にtarファイルをアップロードしています。

パッケージのインストール

先程アップロードしたtarファイルを展開します。もし記事通りの場所にアップロードした場合、tarファイルを展開するためのコマンドは、以下のようになります。

!tar -zxvf /content/drive/MyDrive/TensorRT/<アップロードしたtarファイルの名前>

実行すると、画像のように展開されます。

画像12

展開されたフォルダ内から、TensorRTに関連するファイルのインストールを行います。

まず、TensorRTのPythonパッケージをインストールします。

%cd /content/TensorRT-<TensorRTバージョン>/python
!sudo pip3 install tensorrt-<TensorRTバージョン>-cp<Pythonバージョン>-none-linux_x86_64.whl

画像19

画像のようにバージョンを指定してパッケージをインストールしています。依存関係にあるパッケージについて、違うバージョンの TensorRT をインストールする際は画像のものとは異なります。

以下、同様にパスに含まれるTensorRTのバージョン部分を変更しつつ、指定のパッケージをそれぞれインストールしてください。

%cd /content/TensorRT-<TensorRTのバージョン>/uff
!sudo pip3 install uff-0.6.9-py2.py3-none-any.whl

画像20

%cd /content/TensorRT-<TensorRTのバージョン>/graphsurgeon/
!sudo pip3 install graphsurgeon-0.4.5-py2.py3-none-any.whl

画像14

%cd /content/TensorRT-<TensorRTのバージョン>/onnx_graphsurgeon/
!sudo pip3 install onnx_graphsurgeon-0.2.6-py2.py3-none-any.whl

画像15

バージョン等問題なければ、この時点でTensorRT利用に必要なパッケージがすべてインストールされたことになります。

サンプルプログラムの実行:Pythonパッケージの取得

続いて、サンプルプログラムを実行してみます。sampleMNISTとは、画像認識を得意とする深層学習フレームワークであるCaffeにて学習済みの0から9までのいずれかの数字が手書きされた画像データをランダムに読み込み、TensorRT用に処理が最適化された推論を実行するサンプルプログラムです。TensorRTでは、このプログラムの実行がHello World!の代替となっています。以下リポジトリ上にsampleMNISTのREADMEが配置されています。

参考:TensorRTリポジトリ

まず、サンプルプログラムを実行するために必要なPythonパッケージをrequirements.txtを参照して取得します。約5分ほど時間がかかります。

%cd /content/TensorRT-<TensorRTのバージョン>/samples/python/network_api_pytorch_mnist/
!python3 -m pip install -r requirements.txt

画像16

上記コード実行時に赤文字でエラーが出力されますが、その後自動で依存関係にあるパッケージを再インストールするため、問題ありません。

サンプルプログラムの実行:共用ライブラリパスの指定

これでPythonに必要なパッケージはインストールされましたが、TensorRT内libフォルダのパスを共用ライブラリパス(LD_LIBRARY_PATH)に設定しなければなりません。以下のコードを実行します。

import os
os.environ['LD_LIBRARY_PATH']='/content/TensorRT-<TensorRTのバージョン>/lib'

画像17

出力は特に出てこないため、設定できたか確認します。

!echo $LD_LIBRARY_PATH

画像18

指定のパスが出力されたら成功です。

一般的にUbuntuではexportコマンドを用いて環境変数の設定を行いますが、Google Colaboratoryの仕様により、上記コードでないと設定が出来ません。
また、こちらは永続的な設定ではありません。
そのため、パッケージ導入時等にランタイムを再起動した場合は、もう一度上記コードブロックを実行する必要があります。

サンプルプログラムの実行

それでは、実際にサンプルプログラムを動かしてみましょう。

%cd /content/TensorRT-<TensorRTのバージョン>/samples/python/network_api_pytorch_mnist/
!python3 sample.py

画像19

このようにDownloadingが始まったら、プログラムは正常に動作しています。大量のデータをダウンロードし学習を行うため、10分ほどの時間を要します。

この操作を実行するときに503エラーが出てしまうことがありますが、mnistのデータ取得等で問題が生じた場合に発生します。少し待ってからコードブロックを再度実行することで、基本的には解決します。

また、学習が終わると以下のWarningが発生することがあります。これはcuDNNのバージョン違いが理由ですが、メジャーバージョンは一致していること、プログラムが正常に動作していることを踏まえ、本記事上では問題ありません。

画像20

学習が完了すると、画像のように結果が表示されます。無事に推測ができています。今回の場合、Test Caseは4、Prediction(予測)は4と一致しており、正解しているようです。この数字は毎回ランダムに選択されます。

画像21

おわりに

今回の記事ではGoogle ColaboratoryにおけるTensorRT環境の構築を行いました。次回の記事では、今回構築した環境を用いて、機械学習の推論を行います。現在執筆中ですので、楽しみにお待ち下さい。

オルトブリッジ・テクノロジー株式会社では、CUDAやTensorRT等のGPUプログラミングに関する情報を発信しています。
企業向けのCUDAプログラミングの教育事業なども行っておりますので興味のある方は note(at)altbridge-tech.jp までご連絡ください。

この記事が気に入ったらサポートをしてみませんか?