NVIDIAのGPUを搭載したグラフィックボードが人気です。2016年はVR・深層学習といった技術が大きく飛躍した年でした。その2016年リリースされたPascalアーキテクチャのグラフィックボードは、VRにも深層学習にも真価を発揮するとあって非常によく売れているようです。実際Pascalのおかげで、今年のNVIDIAの売上高は前年比35%アップなんて調査もあるくらいです。今回はそんなNVIDIAのGPUドライバーをUbuntuにインストールする方法を紹介します。
NVIDIA製GPUのドライバーについて
Ubuntuで一般的に使われているNVIDIA製GPU向けドライバーには、次の2種類が存在します。
- コミュニティ製のFLOSSなドライバー(nouveau)
- NVIDIA製のプロプライエタリなドライバー
Ubuntuをインストールした直後であれば、自動的にnouveau(ヌーヴォー)ドライバーを使用していることでしょう。このnouveauドライバーは、利用者にとって便利で高性能な自由ソフトウェアとしてのドライバーを提供することを目的として、コミュニティで開発されているドライバーです。開発した成果はカーネルに取り込まれているので、カーネルのバージョンによってサポートしているデバイスが異なります。たとえば最新のPascalアーキテクチャーを採用したGPUをサポートしているのはKernel 4.8以降です。現在はKernel 4.4を使用しているUbuntu 16.04 LTSの場合、次のようにエラーとなります[1]。
nouveauは今のところグラフィックドライバーとしての開発をメインターゲットにしているため、GPGPUとしてはほぼ利用できません。たとえばNVIDAのGPGPUライブラリであるCUDAを使う目的でNVIDIAのGPUを使うのであれば、NVDIIA製のドライバーが必要になります。つまりCUDAをインストールする前に、nouveauドライバーを無効化してNVIDIA製ドライバーをインストールする必要があるのです。
さてそのNVIDIA製ドライバーですが、Ubuntuの場合はさらに3種類のインストール方法が存在します。
まず最初にUbuntuでは公式リポジトリに複数のバージョンのNVIDIA製ドライバーをパッケージとして提供しています。
ここで「Transitional package」となっているものは、新しいバージョンへの移行を目的としたパッケージなので気にしなくてかまいません。実質、nvidia-304、nvidia-340、nvidia-367の3つのパッケージが提供されていることになります。
最新のグラフィックチップでなければ、基本的に公式リポジトリのパッケージで問題はないはずです。特にデスクトップの場合はシステム設定の「ソフトウェアとアップデート」の「追加のドライバー」タブから、上記のパッケージをインストールできます。特定のバージョンでうまく動かない場合は、別のバージョンを使ってみてください。また公式Wikiにはいくつかのトラブルシューティングが掲載されていますので、そちらも参考になるでしょう。
Graphics Drivers TeamのPPAにはより新しいバージョンのドライバーパッケージが用意されています。これらは主に公式リポジトリに取り込むためのテスト目的のパッケージであるため、インストールすると何らかのトラブルが発生する可能性もあります。ただしより新しいGPUを搭載したグラフィックボードの場合は、公式リポジトリのパッケージではサポートしていない場合も多々あります。たとえばGeForce GTX 1050 Tiの場合は、バージョン375.20以降でサポートしているため、2017年1月時点での公式リポジトリのパッケージ(nvidia-367)では動作しません。よって必要に応じてこちらのPPAを利用してください。ちなみにテスト結果やパフォーマンステストの内容などは、Graphics Drivers Testersのメーリングリストに投稿されます。このPPAを使う前はメーリングリストの内容を確認しておくと良いでしょう。もちろん個人でパッケージをテストして報告すれば、より新しいドライバーがより早く公式リポジトリに取り込まれることになります。
いずれのパッケージもNVIDIAのサイトで公開されているドライバーが元になっています。つまりNVIDIAのサイトからドライバーをダウンロードする方法であれば、常に最新のドライバーを使用できるということです[2]。ただしNVIDIAで配布されているドライバーのインストールスクリプトは、Ubuntuだけでなく他のLinuxディストリビューションにも対応した作りになっています。さらにデスクトップ環境(X Window Systemが動いている環境)においてNVIDIA製のインストーラーを使うと、まずX Window Systemを止めておくようにと言われます。Ubuntu上にグラフィックスドライバーとしてNVIDIA製のドライバーをインストールしたい場合は、NVIDIAのインストールスクリプトではなく、より手間の少ない上記パッケージを使う方法をおすすめします。
もしGPGPUとして使うことのみが目的でありGUIが必要ない場合であれば、NVIDIAのインストールスクリプトを使うという選択肢も意味が出てくるでしょう。なぜならUbuntuパッケージのほうは、Xサーバーやディスプレイマネージャーのパッケージなどデスクトップ環境一式にも依存しているからです。このためUbuntuパッケージ版を使用すると、デスクトップ環境関連のパッケージもセットでインストールされます。「気にしない」のもひとつの手ではありますが、Ubuntuサーバー上でGPGPUを使いたいのであればNVIDIAのインストーラースクリプトを使うことでインストールするパッケージを必要最低限な量にとどめることができます。
プロプライエタリなドライバーのインストール方法
ここからは実際のインストール手順を解説します。まず最初にNVIDIA製のドライバーをインストールする際の注意点です。
- セキュアブートは無効化しておく
- デクストップ環境が立ち上がらなくなった時のリカバリー手段を用意しておく
- GPGPU目的ならグラフィックの出力先をNVIDIAのGPU以外にしておく
第444回でも紹介したようにセキュアブートは特定の鍵で署名されたブートローダーやカーネルのみを起動する仕組みです。Ubuntuの場合、カーネルモジュールも検証対象になります。つまりセキュアブートが有効化された環境では、Ubuntuのカーネルに同梱されていないカーネルモジュール(サードパーティのモジュール)はロードできません。もしセキュアブートを有効化した状態でサードパーティのモジュールをロードしたい場合は、自前で鍵を用意してmokutil
コマンドで登録する方法もあります。ただし手順や鍵の管理が若干煩雑ですので、状況が許せばUEFIの設定ツールでセキュアブートを無効化してしまいましょう。なおセキュアブートを有効にしてUbuntuをインストールしたとしても、無効化したあとにUbuntuの再インストールが必要になることはありません。
ちなみに公式パッケージもしくはPPAのNVIDA製ドライバーをインストールする場合は、DKMSパッケージも一緒にインストールします。DKMSはもともとサードパーティのカーネルモジュールをインストールする際に使用する仕組みです。つまりそのままだとセキュアブート上ではDKMSが動作しませんので、セキュアブートが有効化された環境にインストールしようとした場合、update-secureboot-policy
コマンドを実行し、「セキュアブートを無効化するかどうか」を問い合わせてきます。
この画面の指示に従えば次回起動時にパスワード入力画面があらわれ、パスワードによる認証に成功すればセキュアブートが無効化される仕組みです。正確には次回起動時に、ブートローダーより前に/boot/efi/EFI/ubuntu/MokManager.efi
が呼び出されます。このUEFIアプリケーションが、セキュアブートのオン・オフだけでなく、MOK(Machine Owner Key:第444回で紹介したPKやKEKなどの鍵一式)の設定変更なども行うのです。そのためMokManagerを使うためにはマシンに何らかのディスプレイを接続しておく必要があります。リモートでは変更できませんので注意してください。特にサーバー上でNVIDIA製ドライバーを使いたい場合は、あらかじめセットアップ時にUEFIファームウェアでセキュアブートを無効化しておく方法をおすすめします。もちろんよりセキュアな環境にしたいのであれば、セキュアブートは無効化せずに自前の鍵を作成・登録しその鍵でモジュールを署名する必要があります。
2つ目の注意点である「リカバリー手段」はグラフィックドライバーをうまくインストールできなくなった時の保険です。特にデスクトップ環境用にグラフィックドライバーのインストールに失敗したら、グラフィカルなログインができなくなる状況に陥ります。そこで何らかの方法でグラフィカルログインできなくなった時の対応を考えておきましょう。一番手っ取り早いのは、ログイン画面で「Ctrl-Alt-F1」ないしは「Alt-F1」を押して仮想コンソールに切り替えることです。黒い画面に白い文字でログインプロンプトが表示されるはずですので、そこからアカウント名とパスワードを入力してログインしましょう。あとはこのコンソールからの操作で、パッケージをアンインストールするなどの方法でリカバリーを試みます。グラフィカル環境に戻りたい場合は「Alt-F7」です。
別の手段としてあらかじめSSHサーバー(openssh-serverパッケージ)をインストールしておく方法もあります。ネットワークさえつながっていれば外部からログイン可能になりますし、仮想コンソールと異なり日本語の表示も可能です。ドライバーをインストールするマシンとは別のマシンが存在するのであれば有効な方法です。デスクトップ環境をインストールしないUbuntuサーバー上でGPGPUを使うのであれば、基本的にはこちらの方法を使うことになります。
最後の注意点である「グラフィックの出力先」はGPGPU専用としてNVIDIA製GPUを使う場合の注意点です。グラフィックカードとしてNVIDIA製GPUを外付けする場合、おそらくマザーボード(大抵の場合はCPU)には最初から何らかの内蔵GPUが搭載されていることでしょう。ディスプレイへの出力はその内蔵GPUに任せて、NVIDIA製GPUはGPGPU専用としたほうがGPUの性能を最大限利用できるというわけです。UEFIの設定ツールにてグラフィックの出力先を変更できるはずですので、あらかじめ内蔵GPU優先にしておきましょう。もちろんディスプレイのケーブルの接続先を変更することも忘れないでください。
ここまで注意しておけば、大抵はなんとかなります。
Graphics Drivers TeamのPPAの導入
使用しているGPUが新しすぎて公式リポジトリのパッケージではサポートしておらず、なおかつNVIDIA製のインストールスクリプトを使わない場合は、まずはGraphics Drivers TeamのPPAを導入しましょう。ちなみに公式リポジトリのパッケージで対応しているかどうかは、システム設定の「ソフトウェアとアップデート」の「追加のドライバー」タブにNVIDIAのドライバーが表示されるかどうかでも判断できます。
デスクトップ環境からパッケージをインストールする場合
デスクトップ環境が動いている状況で、NVIDIA製のGPUドライバーをデスクトップ用途でインストールしたい場合は、システム設定の「ソフトウェアとアップデート」の「追加のドライバー」タブからインストールしたいバージョンを選択する方法が一番簡単です。
少し待てば、インストール可能なドライバーパッケージのリストが表示されるはずです。インストールしたいドライバーが表示されない場合は、そのデバイスをサポートしているドライバーパッケージが存在しないということです。必要に応じて手動でインストールする方法などを模索してください。各項目の末尾の丸括弧が「オープンソース」ならmain、universeから、「プロプライエタリ」ならrestricted、multiverseからインストールすることになります[3]。
インストールしたいドライバーを選択して「変更の適用」ボタンを押すと、インストールを開始します。NVIDIA製ドライバーの場合、カーネルインターフェースのコンパイル処理も走る都合上、インストール完了までそれなりに時間がかかりますので、のんびりと待ちましょう。必要なパッケージのインストールや設定はすべてパッケージが行ってくれます。インストールが完了したら再起動してください。
またデスクトップ関連の設定は、「nvidia-settings
」を実行して設定ダイアログを表示しましょう。端末からも起動できますし、デスクトップファイルが用意されているのでUnityのDashからも検索して起動できます。ここでダイアログで設定した内容は、「~/.nvidia-settings-rc
」に保存されます。グラフィカルログインのたびに「/etc/xdg/autostart/nvidia-settings-autostart.desktop
」が実行されて、設定ファイルの内容が反映される仕組みです。
パッケージとしてインストールした場合は、「/usr/share/doc/nvidia-375/html/index.html
」にNVIDIAドライバーのドキュメントがインストールされます。設定方法について疑問がある場合は、ウェブブラウザーで内容を確認してみましょう。「nvidia-375
」の部分は、ドライバーのバージョンによって変わります。
デスクトップ環境以外からパッケージをインストールする場合
Ubuntuサーバー上でNVIDIAのドライバーをパッケージとしてインストールする場合は、次のコマンドを実行してください。
最後の「nvidia-375
」の数字は、どのバージョンのドライバーをインストールしたいかどうかによって変わります。ちなみにubuntu-drivers
コマンドを利用すると、「追加のドライバー」と同等の出力をコンソールに表示できます[4]。
インストールが完了したら、再起動しましょう。パッケージ版のドライバーの場合、/etc/modprobe.d/nvidia-375_hybrid.conf
や/etc/modprobe.d/nvidia-graphics-drivers.conf
に「blacklist nouveau
」が記載されるため、nouveauドライバーはロードされなくなります。その代わり、「nvidia」という名前のついたドライバーがロードされます。
またnouveauドライバーだと「unknown chipset」になっていたGeForce GTX 1050Tiも以下のように認識されていることがわかります。
前述したようにパッケージ版のNVIDIA製ドライバーはデスクトップ環境のパッケージ一式に依存しています。このためUbuntuサーバー上でインストールしようとすると、芋づる式に大量のパッケージがインストールされます。
推奨パッケージをインストールしない「--no-install-recommends
」オプションである程度は抑制できますが、それでもそれなりの数の「余計な」パッケージをインストールすることになるでしょう。サーバー環境であれば次のNVIDIA製のインストールスクリプトを利用する手順のほうが、本来は不要なパッケージをインストールしなくてすみます。
NVIDIAのインストールスクリプトを利用する場合
インストールスクリプトはNVIDIAのサイトで利用OSなど必要な情報を入力するか、Unix Driver Archiveのページから直接バージョンを指定してください。拡張子が「.run
」のファイルがひとつだけダウンロードされます。このファイルは前半にオプションパーサーやアーカイブ展開コードが入っているシェルスクリプトで、後半がアーカイブバイナリという構成になっています。
ダウンロードしたファイルは、シェルに渡すか実行権限を付けて実行します。まずは「--help
」を実行してだいたいの使い方を把握しておきましょう[5]。
「--advanced-options
」を渡すと、より細かいオプションも確認できます[6]。「--info
」はインストーラーの情報を、「--list
」はアーカイブに含まれているファイルのリストを表示します。
実際にインストールスクリプトでインストーラーを実行する前に、まずは必要なパッケージをインストールします。インストール方法にもよりますが、主に必要なのは次の3つです。
- カーネルのヘッダーファイル
- ビルドツール
- DKMS
NVIDIA製ドライバーは、ソースコード部分とプロプライエタリなバイナリ部分にわかれています。ソースコード部分がカーネルモジュールのカーネルとのインターフェース部分です。この部分は使用するカーネルごとにコンパイルする必要があるため、ソースコードとして提供されています。このコンパイルにカーネルのヘッダーファイルとビルドツールが必要になります。また、プロプライエタリなバイナリ部分とコンパイルしたバイナリとは、リンカーで連結します。
また、カーネルのバージョンごとにソースコード部分をコンパイルする必要があるため、カーネルのバージョンアップ時に自動的にリコンパイルするようDKMSも導入しておいたほうが便利です。通常のUbuntuであれば、dkmsパッケージさえインストールしておけば、ヘッダーファイルもビルドツールも一緒にインストールできます[7]。
あとはインストーラーを管理者権限で実行しましょう。NcursesベースのUIが起動しますので、原則として「Yes」や「OK」を押していきます。ちなみにインストールスクリプトはnouveauドライバーがロードされている環境では、警告を出してエラー終了します。nouveauドライバーを検知したら、nouveauドライバーを無効化する設定ファイルを「/etc/modprobe.d/
」にインストールするよう「--disable-nouveau
」オプションも付けましょう。もちろんあらかじめnouveauを無効化しているのであれば、このオプションは不要です[8]。
Ubuntuサーバーの場合はX Window Systemが存在しないため、それに関連した警告が表示されます。そもそもデスクトップ環境を使わないのであれば、Xの設定ファイルを変更するnvidia-xconfig
の実行も不要です。また32ビットプログラムも不要なので、32ビット互換ライブラリがなくても問題ありません[9]。
「/etc/modprobe.d/
」にnouveauを無効化するスクリプトがインストールされました。カーネル起動時にこのスクリプトが反映されるよう、update-initramfs
コマンドを実行した上で[10]、最後に再起動します。
再起動後にnouveauドライバーがロードされていないこと、代わりにnvidiaドライバーがロードされていることを確認します。
またnvidia-debugdump
コマンドやnvidia-smi
コマンドを使えば、デバイスの情報が表示されます。
NVIDIA製のインストーラースクリプトの場合、パッケージ版と違って自動的な更新は行われません。必要に応じて「--update
」オプションを付けてスクリプトを実行してください。もしくは「--latest
」オプションを付ければ、より新しいバージョンがあるかどうか確認できます。