A certain engineer "COMPLEX"

開発メモ その120 TensorFlowをnvidia docker on Ubuntu 18.04にインストールする

Introduction


darknetに引き続きTensorFlowもインストールしてみます。
いつも思うのですが、フレームワークを知っているのと、インストールして試しに使ってみるだけでも大分違うと思います。
インストールした後に+αで何かできたらもっとよいですが。

Get Started


公式ページにすべて手順が書いてあります。
Pythonにインストールするよ、ってことで特に難しいことはないと思います。

ただ、Pythonを使うといっても、インストール先は

  • Virtualenv
  • "native" pip
  • Docker
  • Anaconda

と複数用意されています。
今回はDockerを使います。

Install

気をつけることもないですが、DockerHubTensorFlowイメージはタグを含めてたくさんあります。

タグは主に

  • (version)-devel-gpu-py3
    • ビルドに必要なソースコートや依存バイナリ付きのPython3用GPU対応版
  • (version)-devel-gpu
    • ビルドに必要なソースコートや依存バイナリ付きのPython2用GPU対応版
  • (version)-devel-py3
    • ビルドに必要なソースコートや依存バイナリ付きのPython3用CPU対応版
  • (version)-devel
    • ビルドに必要なソースコートや依存バイナリ付きのPython2用CPU対応版
  • (version)-gpu-py3
    • Python3用GPU対応版
  • (version)-gpu
    • Python2用GPU対応版
  • (version)-py3
    • Python3用CPU対応版
  • (version)
    • Python2用CPU対応版

の8種類があります。
(version) は、latestnightly、バージョン番号があります。
個人的には、latestを選ぶと、このバージョンいくつだっけ?っことになってわからなくなるのであまり好きではありません。

2018/05/05時点の最新のTensorFlowは1.8です。
なので、1.8を使います。
下記コマンドで、イメージをpullし、コンテナに入ります。

コンテナに入った後です。

TensorFlowのGPU版とTensorBoardがインストールされているのがわかります。
TensorBoardは深層学習の状況などを可視化できるWebコンソールです。
これを確認するには、コンテナのポートを開く必要があります。
ですので、下記のようにコンテナを再実行し、TensorBoardを起動します。ホスト側のポート番号は自由ですが、コンテナ側は6006にします。

Test MNIST

おなじみのMNISTのサンプルがgithubにありますのでありがたく使わせてもらいます。

tensorflow/tensorflow
tensorflow - Computation using data flow graphs for scalable machine learning

このサンプルは、mnistの学習結果をTensorBoardで確認できるように出力してくれます。

使い方は下記です。

実行後、別のコンソールから学習中のコンテナに接続し、下記コマンドを実行します。

TensorBoardが起動するので、ブラウザからホストOSのポートにアクセスします。

学習初期

学習終了

開発メモ その119 YOLOv3をnvidia docker on Ubuntu 18.04で動かす

Introduction


nvidia dockerを使えるようになったので、UbuntuでもYOLOv3を試してみます。

Get Started


今回は、自分でDockerHubにイメージをpushしてみました。

dockerfileもgithubに登録してあります。

takuya-takeuchi/Demo
Sample source code for Demonstration, Experiment and Test

dockerfileの中身はシンプルに

  1. apt-getで必要なバイナリ収集
  2. OpenCVをビルドしてインストール
  3. darknetのビルド

を行っています。

下記のコマンドで、イメージをpullし、コンテナに入れます。
実行後は、コンテナは破棄されます。

コンテナに入ったら、weightファイルを拾ってきて、実行します。

Windows版と遜色ない性能です。
Docker経由でも性能は変わりません。

CUIでの実行なので、本来はOpenCV経由で画像が画面に表示されますが、それはエラーになっています。
ただし、出力結果はディスクにpredictions.jpgとして出力されていますので確認できます。
scpコマンドで画像ファイルを転送するなりして確認します。

.NETで機械学習を試してみる LibLinear.Net編 第1回

Introduction


以前、LIBSVMという台湾生まれのSVMライブラリのC#ラッパーを作成しました。
今回、同じ台湾生まれのLIVLINEARのC#ラッパーLibLinear.Netを作成しました。

takuya-takeuchi/LibLinearDotNet
LibLinearDotNet - .NET wrapper for LIBLINEAR written in C#

LIVLINEARのライブラリも.NETラッパーは少ない感じです。

  • libsvm.clr
    • C++/CLIでLIBLINEARを再ビルドして.NETから呼べるようにしています。

めぼしいのはこれ位でした。

LibSvm.Netと同じく、

  • XMLコメントほぼ全て英語と日本語で実装していますので、IntelliSenseがバリバリ
  • 100%C#の.NETStandard準拠
  • Linuxで動く

そして、前回と同じサンプルをLibLinear.Netで実装したものを持ってきました。

takuya-takeuchi/LibLinearDotNet
LibLinearDotNet - .NET wrapper for LIBLINEAR written in C#

Get Started


LibSvm.Netを使うには下記の作業が必要です。

      1. NugetからLibLinear.Netのインストール
      2. LIBLINEARのソースをダウンロード
      3. LIBLINEARのソースをビルド

ちょっと面倒ですが、どれも手順はしっかりしています。
LIBLINEARのビルド手順はLibLinear.NetのWikiでも説明していますので参考にしてください。

Sample


このサンプルは、訓練データとテストデータの分類または回帰を実行します。
実行のために、

  • https://www.csie.ntu.edu.tw/~cjlin/libsvmtools/datasets/multiclass/pendigits
  • https://www.csie.ntu.edu.tw/~cjlin/libsvmtools/datasets/multiclass/pendigits.t

をダウンロードします。
これは手書き数字のデータセットです。MNISTと似ているのかな?

引数として、

  • ソルバー (オプション)
    • 例: -s=4
  • バイアス (オプション)
    • 例: -b=3
  • 学習済みファイルの出力先 (オプション)
    • 例: -o=trained.model

を指定できます。

分類と回帰によって実行結果が異なります。

分類

回帰

Conclusion


またも、正直車輪の再発明な気がしないでもないですが...
LibLinearのメリットは、大規模データに対してLibSvmよりも高速に実行できるところがウリのようです。
このあたりの高速性も紹介していきたいです。

Source Code


https://github.com/takuya-takeuchi/LibLinearDotNet/tree/master/example/Pendigits

開発メモ その118 Dockerのビルド時間 (主にapt-getやyum) を短縮する

Introduction


備忘録。
Dockerで毎回buildまたはrunするとき、apt-getやyumが含まれると構築に時間がかかります。
ネットで調べてみると透過型Proxyとか色々対応策がありましたが、上手くいきませんでした。

そんな中、DockerHubから取得したイメージそのものを更新する、という手法を見つけました。

How to?


素晴らしいアイデアはこちら。

Dockerfile ビルド時間短縮 tips - Qiita
ubuntu や centos などの dockerhub イメージを使って Dockerfile を書くとき、大抵の場合 apt-get update や yum update を先頭に書きます。```FROM ubuntu:...

手順は下記

1. ホストOS上

2. コンテナ内

3. ホストOS上

実際は、元となるイメージは複製しておくと、より安心ですね。
最終のビルドテスト時に、FROMをオリジナルに戻せば事足りそうです。

開発メモ その117 UbuntuでDokcerイメージの置き場所を変更する

Introduction



2018/05/01 更新
NTFSのパーティションを置き場所として指定しましたが、dockerではNTFSは未サポートとのこと。
詳細は、how to solve it? docker: error creating overlay mount to invalid argument #23930

備忘録。
USBメモリに格納したUbuntuでdockerを動かしているが、dockerは何かとディスクの容量を食うのと、書き込みが多いとUSBの耐久性が心配なので、イメージの場所を変えてみることにした。

How to?


もぉそのままズバリな記事を書いてくださっている方が。ありがとうございます。

Dockerイメージの格納先変更 - Qiita
Ubuntuでインストールしたdockerはデフォルトでは/var/lib/docker配下にイメージを格納します。とは言うでも/var/lib/dockerを含んだボリュームのサイズがそんなに大き...

要するに、/lib/systemd/system/docker.serviceの中身を変更しなさい、ってことでした。
上の先人様は、docker.serviceを今後は編集したくない、ということで環境変数経由で設定を変更するという目から鱗な方法で対応されています。
渡しもそれを真似ます。

docker.service の修正

編集前

編集後

/opt/config/docker の作成

追加

編集の反映と確認