ニュース

NVIDIA Tegra K1搭載開発キット「Jetson TK1」ハンズオンセッションに参加してみた

コンピュータビジョン開発を加速する開発キット。動画のGPU処理を手軽に体験

2014年7月16日開催

NVIDIAの最新モバイルSoC「Tegra K1」搭載開発キット「Jetson TK1」

NVIDIAの最新モバイルSoC「Tegra TK1」

 7月16日に開催されたNVIDIAの「GTC Japan 2014」で、Jetson TK1のハンズオンラボが開催された。ここでは、そのハンズオンの模様とJetson TK1について簡単にリポートする。

 NVIDIAのJetson TK1は、ARMプロセッサコアを内蔵したSoC(System on a Chip)であるTegra K1を搭載した「評価ボード」だ。評価ボードとは一般に、半導体デバイスを評価してもらうために、動作可能な回路を組んだ回路基板のことをいう。Jetson TK1は、RAMやフラッシュメモリを搭載し、USBやHDMI、イーサーネットコネクタなどを装備し、ボードコンピュータとして動作する評価ボードだ。

Tegra K1のブロックダイヤグラム
Tegra K1を搭載するJetson TK1

 Tegraシリーズは、ARMプロセッサを搭載したSoCで、これまでは主にスマートフォンのアプリケーションプロセッサなどに使われてきたが、Tegra K1は、PC用などと同じアーキテクチャのGPUを搭載し性能を強化してある。特にGPUを使った汎用演算や画像処理が可能で、広く組み込み用としての利用も可能だ。このTegra K1を普及させるため、NVIDIAはJetson TK1を開発。代理店や自社サイトでのオンライン販売を開始している。Tegra K1の用途の1つとして、NVIDIAは「マシンビジョン」を想定しており、Jetson TK1にもそのための機能がある。Jetson TK1には最初からLinuxがインストールされ、マシンビジョン実現のためのライブラリなども含まれている。

 こうした組み込み用のプロセッサで動かすソフトウェアの開発には、大きく「クロス開発」と「セルフ開発」の2通りがある。クロス開発とは、ソフトウェアの記述やコンパイルまでをPCで行い、作られたバイナリプログラムを開発対象機器(ターゲットと呼ばれる)に転送して動作のチェックやデバッグを行うことをいう。PCが必要になるが、開発環境が充実しており、高度な機能を持つ開発環境や開発サポートツールなどが利用可能というメリットがあり、多くの場合、クロス開発を行うことが普通だ。こうしたクロス開発は、たとえばスマートフォン用のアプリなどでも行われており、アンドロイドなどでは、PCやMacintoshなどで開発を行う。また、このためにターゲットと同じように動作するエミュレータを持つ場合も少なくない。エミュレータを使うことで、タイミング的な問題以外のデバッグや動作チェックがPC側で可能になる。

 これに対して「セルフ開発」とは、ターゲット機器でソフトウェアの開発を行うもので、ある程度性能の高いシステムの場合に使われる方法だ。最近では、多くの組み込み向けプロセッサでもLinuxが動作するため、比較的開発環境を構築しやすくなっている。また、実機ですぐに動作させることが可能なため、完成したソフトウェアを転送する手間がなく、特殊なハードウェアアプリケーションや動作タイミングに関する処理のデバッグが行えるというメリットがある。

 Jetson TK1はセルフ開発が可能であり、カメラからのリアルタイムの入力を処理するというプログラムなどを直接デバッグすることが可能だ。Jetson TK1にはLinuxと開発環境があらかじめインストールしてあり、ユーザーはディスプレイ(HDMI接続)、キーボード、マウス、カメラなどをUSB接続すればすぐに開発を開始できる。また、有線LAN(ギガビットイーサーネット)もあるため、開発作業中にWebブラウザでのインターネットアクセスが可能で、調査やインターネットで配布されているソフトウェアなどの入手も可能。単体で完全な開発環境として利用できる。

Jetson TK1にディスプレイ、マウス、キーボードを接続すれば、組み込まれているLinuxが動作する

 また、本体には基本的なユーザーインターフェイス関連のコネクタだけでなく、ミニPCI Expressコネクタ、SDカードスロット、専用拡張コネクタやSATA、PCと同じHDD用4ピン電源コネクタなどが装備されている。Jetson TK1単体での利用だけでなく、さまざまな周辺回路やデバイスを接続することが可能で、ハンズオンではLEDを拡張コネクタに接続、点滅するサンプルを動作させるということも行われた。

Jetson TK1には、このようにさまざまなコネクタやインターフェイスが搭載されていて、単体のコンピュータボードとして動作できる
Jetson TK1のブロックダイヤグラム

簡単なサンプルプログラムが動作するところまでを体験

 今回のハンズオンラボは、こうしたJetson TK1を動かし、簡単なサンプルプログラムを動作させるところまでをカバーするものだ。Jetson TK1には、出荷時にUbntuベースのNVIDA Tegra Linuxが組み込まれており、ディスプレイやキーボード、マウスを接続して電源を入れるだけでGUIのシステムが起動する。この状態で完全なLinuxが動作しているため、ここでプログラムを編集、コンパイルしてもよいし、PC側に開発環境を作り、そこで生成したバイナリプログラムを転送してもよい。LinuxなのでWindowsとは少し勝手が違うが、ネットワークを介したファイルの転送はGUIベースで簡単に行えるし、必要に応じてコマンドラインを使ってもかまわない。

 ハンズオンラボでは、すべてJetson TK1上で、サンプルプログラムの編集からコンパイル、実行までを行った。ただし、エディタはGUI版を使ったが、コンパイルなどは手動で行った。過去にUnixワークステーションやPC用のUnix、Linuxを使っていたユーザーなら、そのときの経験を生かすことも可能だ。viなどのコマンドライン(Linux側ではターミナルエミュレータウィンドウ)で動作するエディタもそのまま利用できるため、すべての作業をコマンドライン内で済ませることも可能だ。標準のシェルもbashであり、ファイル名の補完などが可能で、コマンドラインだからといってそれほど不便でもない。

 Jetson TK1は、起動するとX Window Systemが立ち上がり、マウスで操作ができる。ディスプレイマネージャにはlightdmが使われており、Ubuntu Linuxディストリビューションの標準的な構成だと思われる。自動的にユーザーubuntuでログインが行われ、GUIデスクトップの表示まで一気に進む。GUIの起動などで途中、少し待たされる感があるが、GUIで何かをするようなものではないので問題ないだろう。

 デスクトップが起動すると、Jetson TK1はマウス、キーボードで利用可能になるが、ターミナルエミュレータは、GUI側にアイコンは登録されておらず、キーボードから「CTRL+ALT+T」で起動する必要がある。

 ハンズオンラボは、最初にJetson TK1の概要などを説明したあと、いくつかの演習課題をこなすかたちで進行した。最初は、簡単なプログラムの入力とコンパイルである。過去にLinuxを使ってソフトウェア開発を行ったことがあればさほど難しくない作業だが、これまでWindowsのGUIでのみ作業してきたユーザーには少し勝手が違うかもしれない。セルフ開発なので、編集、コンパイル、実行が基本的な作業のサイクルだが、おそらく実際の開発では統合開発環境を使ったり、ソースコード管理ツールを併用するなど、手順は違ってくるが基本原理としてはこれと同じだ。

ハンズオンの最初の課題は、プログラムを入力して、コンソールウィンドウ(ターミナルエミュレータ)を起動しコンパイルしてみること

 次は、CUDAを使うサンプルプログラムをコンパイルして実行させてみる作業だった。プログラム自体は高度なデモプログラムだが、プログラム自体は完成しているため、単純にコンパイルして実行、動作させてみるという形。これで、CUDAを使った場合のTegra K1の性能を多少体感することができる。こうした組み込み系のプロセッサにしては、高い負荷のグラフィックスやシュミレーションをこなしており、それなりの性能があることを実感できた。

スモークを発しながら動くオブジェクトを3Dレンダリングするサンプルプログラム。こうした高度なプログラムもJetson TK1上でコンパイルして動作させることができる。また、これ以外にも多数のサンプルプログラムが用意されている

 次は、OpenCVによるコンピュータビジョンプログラムのサンプルを使った作業だった。OpenCVはコンピュータビジョン用のライブラリで、すでにWindowsやAndroid、MacOS、iOSやLinuxなどで動作している。比較的計算負荷が高く、SIMD(Single Instruction Multiple Data。1つの命令で複数のデータを処理する方式)演算機構が必要で、対応プロセッサはx86(MMX/SSEを利用)、ARM(NEON)、NVIDA GPU(CUDA)などである。Jetson TK1の場合CUDAを利用できるが、ARMコア側にあるNEONでも動作させることが可能だ。

 まずは、USBカメラからリアルタイムに画像を取り込んで、ウィンドウに処理結果を表示するデモを動かしてみる。手順としては単純なプログラムと同じだが、プログラムコードはC++で、コンパイル時にOpenCV関連のライブラリをコンパイラの引数として指定してやる必要がある。

 さらに、Jetson TK1ならではのデモとして、ARM NEONで動作しているプログラムをCUDA用に書き直し、パフォーマンスの違いを見ることを行った。ARM NEONは、128bitに複数の演算データをまとめて、同時に演算を行わせるSIMD演算機構の名称だ。x86のSSEに相当する機能である。たとえば32bitの整数ならば、128bitには4つの値を格納できるため、色の演算ならばRGBA(赤、緑、青に透明度のアルファ値)を各32bitで表現すると128bitに収まり、NEONやSSEで行うとこれをまとめて処理できる。一般的なCPUの命令では、各原色ごとに4回に分けて計算しなければならない処理(たとえば、画像の一部の領域の色の平均値を求める)を1回で行うことができるために、処理速度が向上するわけだ。

 これに対してCUDAは、GPU機能を使ってSIMD演算を行う。一度に処理できるデータの数はGPUによって違うものの、数十個以上などと高い並列性があり、より多くのデータを一度に演算させることができる。前述のような画像の一部領域の色の平均値を求めるような演算では、色を並列に処理するだけでなく、領域を複数の小さな領域に分割して並列して処理できるため、CPUを使った場合の数倍から数十倍といった高速化が可能になることもある(どれだけ高速化できるかは処理によって違って来る)。Jetson TK1に搭載されているTegra K1には、192個のCUDAコアがあり、これを並列に動作させることが可能だ。

 ただし、同じアルゴリズムのOpenCVプログラムをCUDAで処理する場合、CPUの場合と少しプログラムに手を加える必要がある。これは、CUDAを処理するGPUとCPUは独立したメモリ空間を持っているため、CPU側からGPU側へデータを転送(uploadと呼ぶ)し、処理が終わった後CPU側へ書き戻す(同download)必要があるからだ。それ以外は、組み込むライブラリの違いなどがある程度。ライブラリは違っても同じ機能が用意されており、upload、downloadを行う以外、基本的なアルゴリズムを変更は変更しなくてもよい(最適化を考えるとコードを大きく変える必要が出てくることもあるだろうが)。

 CPUとGPUで同一の処理を行っている最中の画面が下の2枚だ。処理としては、動画から動きのある部分とそうでない部分を切り分け、背景のみの画像と動いている部分のみの動画を作る処理だ。これは、たとえばジェスチャーの認識などを行う場合の基本となる処理。CPUを使った場合、フレームレートは、9〜12FPS(Frame Per Second。1秒間の表示フレーム数)だが、CUDAを使うと30〜40FPS程度にまで跳ね上がる。

CPUによる動画解析のデモプログラム。オリジナル動画(右下)から動いているものを抽出(左下、中央下)し、背景部分だけを抜き出した動画(右上)を作る。処理はリアルタイムに行われ、そのときのフレームレートが中央上のウィンドウに表示されている
同じプログラムをGPUで処理させる。フレームレートが大きく上がっている

 ハンズオン最後の課題は、Tegra K1のGPIOを使うもの。GPIOとは、SoCから出ているデジタルの信号ラインで、設定で入力、出力ともに利用でき、特定の目的を持たず、開発者がハードウェアを接続する場合などに利用するものだ。汎用的に利用できるため「Genaral Purpus I/O」と呼ばれ、略して「GPIO」と呼ぶ。デモでは、GPIOにスイッチ(入力)とLED(出力)を接続し、スイッチの状態を調べてLEDを点滅させるというものだ。Jetson TK1にはGPIOなどの各種インターフェイスを出力するコネクタが用意されており、これを使ってハードウェアを接続できる。

GPIOは、基板上のヘッダコネクタに出力されており、ここにLEDやスイッチを接続してプログラムで制御することが可能

 短時間ながら、ハンズオンラボではJetson TK1の基本的なところから、アプリをコンパイルして動作させるところまでが確認できた。一般に新規のプロセッサやシステムを使って開発を行う場合、開発環境を正しくインストールしてメーカーが提供するサンプルプログラム(正しく動作することが確認されているため確認がしやすい)を動作させるまでが1つのヤマといってもいい。

 Jetson TK1は、Ubuntu Linuxディストリビューションベースで、必要なツールチェーン(コンパイルからバイナリ生成までを行うツール一式)や専用ライブラリがすでにインストールされているセルフ開発環境がすぐに利用できるという点は大きい。SDカードをマウントしたいなどの一般的な情報に関しては、Ubuntuをキーワードに加えてインターネット検索することで大体解決できるし、Jetson TK1固有の問題に関しては、NVIDIAのJetson TK1サポートWebサイト(https://developer.nvidia.com/jetson-tk1-support)やDeveloper Zone(https://devtalk.nvidia.com/default/board/139/embedded-systems/)がある。また、JetsonTK1で動作しているLinuxは、Linux For Tegra(L4T)と呼ばれ、サポートページ(https://developer.nvidia.com/linux-tegra-rel-19)に最新版およびドキュメントなどが用意されている。サンプルのコンパイルができるようになれば、あとは、自力で開発を進めることも難しくないだろう。

NVIDIAがTegra K1のデモで使用していた動画認識。クルマや車線をTegra K1が認識し、ワーニングなどを出力。ADAS(Advanced Driver Assistance Systems)分野での利用をターゲットとしている

(塩田紳二)