2018年7月7日土曜日

GoogleのTPUって結局どんなもの? 日本法人が分かりやすく説明


    機械学習に特化したGoogleの自社開発プロセッサ、「TPU(Tensor Processing Unit)」。Google自身は「Google Search」「Google Translate」「Google Photos」といったサービスで活用している。日本法人がこれについて分かりやすく説明した。


 機械学習に特化したGoogleの自社開発プロセッサ、「TPU(Tensor Processing Unit)」。2018年7月6日、日本法人がこれについて分かりやすく説明した。

 TPUは、ディープラーニングを高速化するため、Googleが開発したプロセッサ。Google自身は「Google Search」「Google Translate」「Google Photos」といったサービスで活用している。

 一方で、Googleは2018年6月27日、クラウドサービス「Google Cloud Platform(GCP)」において、TPUをGCPユーザーが活用できる「Cloud TPU」の正式提供を始めた(GA)。米国、欧州、アジア太平洋地域で、後述のTPU v2が使える。1TPUを6.5ドル/時(米国の場合)で利用可能。料金は1秒単位で請求される。突然止まっても構わないのであれば、「Preemptible Pricing」という料金体系を活用すると、1.95ドル/時(米国の場合)になる(なお、Preemptible PricingでTPUが停止した場合、学習はチェックポイントから再開することになる)。Cloud TPUは、元々Googleが開発したオープンソース機械学習ライブラリTensorFlowを通じてのみ利用できるが、高速な処理を安価に利用できるというのが特徴だ。

TPUが「ディープラーニングに最適化されている」理由は2つ

 TPUは3世代目を迎えようとしている。

 第1世代「TPU v1」は2013年に開発を始め、2015年に運用が開始された。この時点では機械学習の推論フェーズに特化していた。推論に加え学習でメリットをもたらす「TPU v2」は2017年に導入を開始。1ユニットで180TFLOPSの演算能力を発揮するという。さらに2018年5月のGoogle I/Oでは、水冷式の第3世代、「TPU 3.0」を発表。演算能力は1ユニット当たり100PFLOPSだという。

 
第2世代のTPU

 グーグルGoogle Cloudチームの佐藤一憲氏は、CPU、GPUのような汎用プロセッサと、ディープラーニングに特化したTPUの違いを、2つのポイントで説明した。

 第1のポイントは、演算精度を犠牲にし、32ビットでなく、8/16ビットの演算器をベースとしていること。

 「汎用プロセッサでは32ビットの演算が主流だが、ディープラーニングで行われる行列演算ではそれほどの精度を求められない。機械学習の推論では、8ビットが最適」(佐藤氏)。このため、TPU v1では8ビットの演算器を6万5536個搭載した構成(これに対し、GPUの「Tesla K80」では、32ビット演算器が2496個)としているという。消費電力も1ユニット40Wに抑えられた。

 これに対し、TPU v2では、16ビットの演算器を3万2768個搭載したプロセッサを、1ユニットに4個搭載した。学習(トレーニング)には16ビットが必要であり、16ビット化により、第2世代のTPUは学習と推論の双方にメリットをもたらすようになったという。第2世代TPUについては、「グーグルの機械学習/AIへの取り組みを支える『AIファーストデータセンター』とは」という記事でも紹介している。

 第2のポイントは、大規模な行列演算パイプライン(「シストリックアレイ」)の実現という。

 「汎用プロセッサでは、演算の間にメモリへの読み書きが発生する。行列演算では、これがボトルネックになる」(佐藤氏)。TPUでは、演算の結果を、演算回路内で直接渡すようにすることで、メモリへの読み書きを大幅に減らすとともに、集約度を高め、電力消費を抑えているという。

2018年7月5日木曜日

機械学習のライブラリ!scikit-learnとは

scikit-learnとは

scikit-learnは、Pythonの機械学習ライブラリです。「サイキット・ラーン」と読みます。scikit-learnはオープンソース(BSD license)で公開されており、個人/商用問わず、誰でも無料で利用することができます。

scikit-learnは、現在も活発に開発が行われており、インターネット上で情報を探すのも容易です。多くの機械学習アルゴリズムが実装されていますが、どのアルゴリズムでも同じような書き方で利用することができます。また、サンプルのデータセット(トイデータセット)が付属しているため、インストールしてすぐ機械学習を試すことができます。

このようなことから、初学者が機械学習を学び始めるには、最適のライブラリと言えます。

他にもオープンソースで使えるPythonのライブラリをまとめているので、合わせてご覧ください。

 

[PR]機械学習で挫折しない学習方法を動画で公開中

scikit-learnを利用するには

scikit-learnを利用するには、Anacondaなどの開発環境のパッケージを使うのが簡単です。

Anaconda

Anacondaは、データ分析やグラフ描画など、Pythonでよく利用されるライブラリを含んだ開発環境です。もちろん、scikit-learnも含まれています。よって、Anacondaを導入するだけで、scikit-learnをすぐ利用することができます。

Anacondascikit-learnがインストールされているかは、メニュー画面のEnvironmentsから、Installedを選択し、検索BOXに「scikit-learn」と入力することで確認を行うことができます。

なお、Anacondaなどの開発環境を利用せず、手動でscikit-learnをインストールして利用することも出来ます。中級者向けとなるため、手順は省略いたしますが、その場合、scikit-learnをインストールする前に、事前に以下のライブラリもインストールする必要があります。

·         NumPy

·         Scipy

·         Pandas

 

scikit-learnの主な機能

次にscikit-learnの主な機能、特に機械学習のモデルについて説明します。

以下をご覧ください。これはscikit-learnのアルゴリズムチートシートと呼ばれます。scikit-learnを用いて機械学習を行う際、自分が行いたい分析(分類/回帰/クラスタリングなど)について、適切なモデルを選択する際の手助けとなるものです。

また、scikit-learnでは、簡単にモデルを取り替えて機械学習を行うことができます。モデルを取り替える方法については、以降の頁で説明します。

 

分類(classification

与えられたデータがどのクラスに属するかを判別するものです。教師あり学習の分類問題を解くアルゴリズムと表現できます。以下のような種類があります。

SGDstochastic gradient descent

大規模データ(10万件以上)におすすめな、線形のクラス分類手法です。

カーネル近似

SGDではうまく分類できない場合に利用する、非線形なクラス分類手法です。こちらも大規模データ向けです。

Linear SVC

中小規模(10万件未満)におすすめな、線形のクラス分類手法です。

k近傍法

Linear SVCではうまく分類できない場合に利用する、非線形なクラス分類手法です。こちらも中小規模データ向けです。

この他、テキストデータの場合、ナイーブベイズという手法があります。

 

回帰(regression

与えられたデータをもとに、目的とする値を予測するものです。教師あり学習の回帰問題を解くアルゴリズムと表現できます。以下のような種類があります。

SGDstochastic gradient descent

大規模データ(10万件以上)におすすめな、線形の回帰分析手法です。

LASSOElasticNet

中小規模(10万件未満)で、説明変数の一部が重要な場合におすすめな、回帰分析手法です。

RidgeLiner SVR

中小規模(10万件未満)で、説明変数の全てが重要な場合におすすめな、回帰分析手法です。

SVR(ガウスカーネル)、Ensemble

Ridge、またはLinerSVRではうまく分析できない場合に利用する、非線形な回帰分析手法です。

 

クラスタリング(clustering

与えられたデータを、なんらかの規則に則って分けるものです。教師なし学習のクラスタリング問題を解くアルゴリズムと表現できます。以下のような種類があります。

KMeans

いくつのクラスタに分かれるのか、事前に決めることができる場合におすすめな、クラスタリング分析手法です。大規模データの場合、MiniBatchといって、データを分けながら学習させる手法を取ります。

スペクトラルクラスタリング、GMM

KMeansではうまく分析できない場合に利用する、非線形なクラスタリング分析手法です。

MeanShiftVBGMM

いくつのクラスタに分かれるのか、事前に決めることができない場合におすすめな、クラスタリング分析手法です。

 

その他の機能

次元削減

与えられたデータの次元数が多い場合、学習効率を上げるため、次元削減という前処理を行います。

PCA、カーネルPCAIsomapSpectralEmbeddingなどの手法があります。

ハイパーパラメータの最適化

機械学習を行う際、学習の方法などを調整する数値のことを「ハイパーパラメータ」と言います。

グリッドサーチ、クロスバリデーションなどの手法があります。

 

scikit-learnを使った機械学習(1)

それでは、scikit-learnを使った機械学習に挑戦してみましょう。今回は、scikit-learnのトイデータセットにある「手書き数字データセット」を使います。以下はanacondaを使った例で表示しています。

データセットの読み込み

初めに、データセットを読み込み、どのようなデータが格納されているか、確認してみます。以下のコードを入力して実行して下さい。

# scikit-learn ライブラリの読み込み
from sklearn import datasets
 
# 手書き文字セットを読み込む
digits = datasets.load_digits()
 
# どのようなデータか、確認してみる
import matplotlib.pyplot as plt
plt.matshow(digits.images[0], cmap="Greys")
plt.show()

実行結果は以下のようになります。

 

訓練データとテストデータの準備

データセットには、「手書き数字の画像データ」と、それに対する「数字」が含まれます。データを訓練データとテストデータに分け、訓練データで学習した結果を、テストデータで検証します。

# 画像データを配列にしたもの(numpy.ndarray)
X = digits.data
 
# 画像データに対する数字(numpy.ndarray)。ラベルと言う
y = digits.target
 
# 訓練データとテストデータに分ける
# 訓練データ :偶数行
X_train, y_train = X[0::2], y[0::2]
# テストデータ:奇数行
X_test, y_test = X[1::2], y[1::2]

 

学習

それでは、モデルに学習を行いましょう。以下ではSVMというアルゴリズムを選択しています。

# 学習器の作成。SVMというアルゴリズムを選択
from sklearn import svm
clf = svm.SVC(gamma=0.001)
 
# 訓練データとラベルで学習
clf.fit(X_train, y_train)

 

モデルの評価

最後にモデルの学習結果を、テストデータを用いて評価します。

# テストデータで試した正解率を返す
accuracy = clf.score(X_test, y_test)
print(f"正解率{accuracy}")
 
# 学習済モデルを使ってテストデータを分類した結果を返す
predicted = clf.predict(X_test)
 
# 詳しいレポート
# precision(適合率): 選択した正解/選択した集合
# recall(再現率) : 選択した正解/全体の正解
# F-score(F) : 適合率と再現率はトレードオフの関係にあるため
print("classification report")
print(metrics.classification_report(y_test, predicted))

実行結果は以下のようになります。とても簡単に機械学習を試してみることができましたね。

 

scikit-learnを使った機械学習(2)

次に、機械学習のアルゴリズムを、ロジスティック回帰に変更してみましょう。学習器の作成の2行を以下のように変更します。

# 学習器の作成。ロジスティック回帰というアルゴリズムを選択
from sklearn.linear_model import LogisticRegression
clf = LogisticRegression()

他のコードは変更の必要がありません。このように、scikit-learnではモデルを簡単に取り替えながら、機械学習を行うことができます。

こちらも、モデルの評価を実行しましょう。実行結果は以下のようになります。

 

「SUSE Linux Enterprise 15」の販売開始、KVMのネストやGPU仮想化に対応

 SUSEは2018年6月25日、「SUSE Linux Enterprise 15」の販売を同年7月中旬に開始すると発表した。併せて、「SUSE Manager 3.2」と「SUSE Linux Enterprise High Performance Computing 15」も提供開始することを発表した。SUSE Linux Enterprise 15は、前バージョンであるSUSE Linux Enterprise 12と比べて、さまざまな改善が施されている。

 まず、「openSUSE Leap 15」からの移行を可能とした。これによりコミュニティーが開発した無償のディストリビューションで試し、本稼働環境ではSUSE Linux Enterprise 15を利用するといった運用が可能になる。システム運用者向けの機能としては、「zypper search-packages」コマンドで、全てのSUSEリポジトリから利用可能なパッケージを検索できるようになった。

 またPython 2.7に加え、Python 3.6に対してもフルサポートが提供される。さらにプレビュー機能として、仮想化機能であるKVM(Kernel-based Virtual Machine)のネスト(仮想マシン上でさらに仮想マシンを稼働させること)や、GPUの仮想化機能、仮想マシンの暗号化「AMD Secure Encrypted Virtualization」への対応なども新たに実装された。

 その他の機能としては、Linuxカーネル(4.12)、gcc(6.4と7.1)、glibc(2.25)、OME(3.26)、Samba(4.6)が提供される。

 SUSE Linux Enterprise 15のサポート期間は13年間。10年間の一般サポートと3年間の延長サポートが受けられる。

Quake III ArenaでAIが「人間レベルの成績」を達成

 AIが習得しようとしているゲームはDota 2だけではない。GoogleDeepMind研究チームは強化学習を使って,AIエージェントにQuake III ArenaCapture the Flagで,対戦できるだけでなく人間との協力プレイでも「人間レベルの成績」を達成した。

 DeepMindの研究は,天気予報やヘルスケアなどに関する複雑な問題を解けるようなプログラムを作ろうとAI学習の境界を拡大している。そのために,研究チームはゲームをより小さな問題を解決する学習プログラムの「練習場」のように使っており,そしていまや共同作業を教えるようになっている。

 強化学習プログラムの背景となる考え方はOpenAIが機械にDota 2のチームプレイを教える方法に近いが(関連英文記事),DeepMindの焦点はチーム構成と対戦相手の多様性の両方にあった。AIQuake III ArenaCapture the Flagを人間や別のAIと対戦プレイすることで学習している。

 「この星には何十億の人々がそれぞれ独自の目標と行動を伴って暮らしています。しかし,それでもチームや組織,社会を通して協働できており,集合知を印象的に示しています」と研究結果を知らせる公式Blogで語っている(参考URL)。「これは我々がマルチエージェント学習と読んでいる設定で,たくさんの個別のエージェントは独立して行動しなくてはならず,さらにほかのエージェントとの連携と協力を学ばなくてはなりません。これは非常に難しい問題です。なぜなら,エージェントが相互に感応することで世界は絶え間なく変化し続けるからです」

 マルチエージェント学習を通じて,DeepMindAIQuake III Arena40人の人間を含むトーナメントでAIをチームメイトや対戦相手としてランダムマッチングを行い,熟達した人間と同等のレベルまで学習した。最終的にAIは勝率でグループ内の最強の人間を上回った。さらに,Dota 2AIと同様に,AIはベースキャンピングといった人間に人気の戦略を取り始めたのだ。

 「将来的に,我々は現在の強化学習と人口ベースの強化法を大きく改良していきたいと思っています」と書き込みは結んでいる。「一般的に言って,我々は,マルチエージェント学習で与えられた自然環境を活用し,人間ともチームを組めるような強固なエージェントの開発を進めることで,この研究がマルチエージェント学習が人工知能開発を進化させる可能性を強調するものと考えています」

2018年7月4日水曜日

Google Homeでプッシュ通知が可能になる「GHKit」を試す(初期設定編)

 現行のスマートスピーカーの弱点の一つに、プッシュ通知ができない、あるいはできても機能が貧弱なことが挙げられる。例えば「Amazon Echo」は、最近になってスキル側で通知機能の実装を始めたが、メールの受信通知などスマートフォンでは当たり前のプッシュ通知がまだできない。

 一方の「Google Home」は、今のところプッシュ通知能自体が搭載されていないが、「google-home-notifier」など外部モジュールを使ってあの手この手でプッシュ通知を実現することは可能で、2017年末にGoogle Homeが発売されて以来、多くのユーザーがその構築にチャレンジしている。ネットでざっと検索しても、さまざまな記事が見つかる。

 とはいえ、これらの設定にあたっては多少なりともプログラミングの知識が必要になるため、初心者にとってハードルが高いわけだが、こうした場合に試してみたいのが、てとてとて合同会社が販売している「GHKit」なるキットだ。

 これは「Raspberry Pi」をベースに上記の基本設定をあらかじめ済ませたキットで、Google Homeを設置しているネットワーク環境に参加させれば、Google Homeにプッシュ通知が可能になる。具体的には、メールを受信すると件名を読み上げてくれたり、雨が降りそうなときにそれを知らせてくれたりする。

 これらは「myThings」や「IFTTT」との連携によって実現していることから、工夫次第でさまざまな通知が行える。スキルごとの通知機能しか用意されないAmazon Echoよりも、自由度は格段に高い。今回はこのキットについて、概要および初期設定の手順を紹介する。

Raspberry Piをベースに設定済みのキット(単体でも提供)

 本キットは最小構成がmicroSDのみ(税込1800円)、標準構成がRaspberry PiRaspberry Pi 3Bをケースに入れたもの)とmicroSDのセット(税込19440円)という2つのラインアップになっている。

 要するにGHKitの本体に相当するのはmicroSDに書き込まれたプログラムで、それを動かすためのハードウェアにあたるラズパイことRaspberry Piは自前で用意してもいいし、なければセットで購入すればいいというわけだ。

 設置方法としては、Google Homeに物理的につなげるのではなく(つなげようもない)、Google Homeが参加しているネットワークに本キットを参加させ、連携させるという手順になる。といってもGoogle Home側で行うことは何もなく、本キット側で設定を行うだけで、Google Homeがプッシュ通知を受け取れるようになるというのが面白い。

 なお接続方法だが、Raspberry Pi 3Bは有線LANポートを搭載する他、無線LANWi-Fi)にも対応するので、接続方法はどちらでも問題ない。ただし初期設定は必ず有線LANで行う必要があり、その際のLANケーブルは自前で用意する必要がある。

ネットワークに参加させるだけでGoogle Homeがしゃべり出す

 設定は専用のスマホアプリ「GHKit」を用いて行う。まずはスマホアプリをダウンロードして使えるようにした上で、本製品にACアダプターを接続し、さらにLANケーブルを使って本製品をルーターもしくはハブに接続する。

 続いてスマホアプリを起動し、製品購入時に同社からメールで受領した「GHKit ID」をスマホアプリに入力して「送信」を行う。ボタンのラベルは「送信」となっているが実質的にはこれはログインに相当する。

 正常にGHKit IDが入力されていれば、メッセージの送信やネットワーク内のGoogle Homeの指定、Raspberry PiWi-Fi設定が行える画面が開く。開かなければGHKit IDが間違っているか、LANケーブルがつながっていないなどの理由でネットワークに接続できていないことが考えられる。

 実はネットワーク構成によっては、もうこの段階でGoogle Homeからジングル音とともに「GHKitです」という男性声のメッセージが読み上げられる場合もあるのだが(筆者宅の環境では読み上げられなかった。理由は後述)、ひとまずWi-Fiでの接続作業を終えてしまうことにする。

 スマホアプリの最下段から画面を「Raspberry Pi」に切り替え、ネットワーク名(SSID)とパスワードを入力し「送信&再起動」をタップした後、Raspberry PiからLANケーブルを取り外す。ちなみにSSIDは自動取得してくれないので、手動で入力する必要がある。併せてACアダプターを抜き差しして再起動を行う。

 再起動が完了すると、GHKitWi-Fiに接続されているはずなので、再度スマホアプリを起動して「GHKit ID」を使ってログインできるかを確かめる。問題なければ、「メッセージ送信」に任意のテキストを記入して「送信」ボタンを押してみよう。Google Homeがその音声を読み上げてくれれば、まずは初期設定が完了というわけだ。

「うまく読み上げられなければIPアドレス指定」で解決

 ここまでが初期設定で、myThingsIFTTTを使った通知の設定手順については次回あらためて紹介するが、筆者宅はネットワーク環境が特殊なせいで、ここまでの初期設定すら試行錯誤したので、その過程をメモとして残しておく。かなりレアな事例だとは思うが、トラブってうまくいかない人は何らかの参考になれば幸いだ。必要でない方は読み飛ばしてほしい。

 筆者宅は、メインとなるWi-Fiルーターに別のモバイルWi-Fiルーターをつなぎ、5GHz帯の機器は前者に、2.4GHz帯の機器は後者に接続して使用している。これは前者のWi-Fiルーターが2.4GHz帯のデバイスとの相性が悪いためで、IPアドレスは前者が「192.168.0.***」、後者が「192.168.111.***」となっている。

 また筆者はGoogle Homeと「Google Home Mini」を各1台所有しており、いずれも前者の「192.168.0.***」のネットワークに参加させている。今回、GHKitを参加させたネットワークは「192.168.111.***」なので、最初の時点では、別のグループに参加していたことになる。

 この状態では、接続完了後に「GHKitです」というメッセージは読み上げられず、Google HomeMiniのどちらも全く無反応のままだ。スマホアプリ側でGoogle HomeMiniIPアドレスを指定しても(試した時点では)やはり反応がなかった。

 この時点で、恐らく参加先ネットワークが異なっているのが原因だろうと予想し、Google Home Miniを取り外し、GHKitと同じ「192.168.111.***」のネットワークに参加させてみたのだが、やはり無反応なままだった。その後、GHKitをいったん有線接続に戻したり、スマホの接続先を2.4GHzWi-Fiに変更してみたりと試行錯誤したのだが、状況は変わらない。

 最終的には、GHKitGoogle Home Miniが同じネットワークに参加している状態で、スマホアプリ側でGoogle Home MiniIPアドレスを指定することで無事にメッセージが読み上げられたのだが、いったん読み上げが成功した後は、別のネットワークにつながっているGoogle HomeIPアドレス指定で読み上げられるようになり、どうも挙動が謎のままだ。

 また、いったん読み上げが成功した後は、同じネットワーク内のGoogle Home MiniIPアドレスを指定しなくとも自動認識するようになったが(これも謎である)、さすがに別ネットワークに属しているGoogle Homeに読み上げさせるには、IPアドレスの指定が必須のようだ。そこまで自動的に探しに行くことは考えられないので、これはまあ当然だろう。

 いずれにせよ、うまく読み上げられない場合、Google HomeMiniIPアドレスを指定してやるというのが、どのケースにおいても手っ取り早く、かつ確実性の高い解決策だといえそうだ。ちなみにスマホについては、GHKitのスマホアプリにログインさえできれば、どのネットワークに接続されていても設定は可能なようなので、参考にしていただきたい。