ボンジニアの備忘録

凡人エンジニア、通称ボンジニアによる備忘録です。勉強した内容を書いていきます。ジャンル問わずです!間違っていたら指摘をお願いします!

Windowsでのdocker-composeのエラー対策メモ

エラー内容

$ docker-compose up

ERROR: for web  Cannot create container for service web: Invalid bind mount spec "C:\\Users\\user\\work\\docker\\django\\web:/usr/src/app:rw": Invalid volume specification: 'C:\Users\user\work\docker\django\web:/usr/src/app:rw'
[31mERROR[0m: Encountered errors while bringing up the project.

どうやらフォルダパスがwindows依存でおかしい模様。

解決策

COMPOSE_CONVERT_WINDOWS_PATHS=1

を使えばいいらしい。環境変数として読み込んでも良いというところもあったんですが、以下のようにコマンド時に書くのもあり。

$ COMPOSE_CONVERT_WINDOWS_PATHS=1 docker-compose up

OK!

機械学習のためのnvidia-dockerを使ったGPU環境構築

環境

Ubuntu 16.04.2 LTS (GNU/Linux 4.4.0-72-generic x86_64)
NVIDIA Corporation GM204GL [Tesla M60] (rev a1)

nvidia driverのインストール

下記から必要なインストーラをインストールする。
https://developer.nvidia.com/cuda-downloads
f:id:yujikawa11:20170409080005p:plain

$ wget https://developer.nvidia.com/compute/cuda/8.0/Prod2/local_installers/cuda-repo-ubuntu-deb
$ sudo dpkg -i cuda-repo-ubuntu1604-8-0-local-ga2_8.0.61-1_amd64.deb
$ sudo apt-get update
$ sudo apt-get -y install cuda
$ sudo shutdown -r now

Dockerのインストール

必要な依存パッケージをインストールする。

$ sudo apt-get install apt-transport-https ca-certificates curl software-properties-common

APT の認証鍵をインストールする。

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

Docker エンジンをインストールするための公式リポジトリを登録する。

$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

リポジトリの内容を更新する。

$ sudo apt-get update

Docker エンジン (Community Edition) をインストールする。

$ sudo apt-get -y install docker-ce

動作確認

$ sudo docker version
Client:
Version:      17.03.1-ce
API version:  1.27
Go version:   go1.7.5
Git commit:   c6d412e
Built:        Mon Mar 27 17:14:09 2017
OS/Arch:      linux/amd64

Server:
Version:      17.03.1-ce
API version:  1.27 (minimum version 1.12)
Go version:   go1.7.5
Git commit:   c6d412e
Built:        Mon Mar 27 17:14:09 2017
OS/Arch:      linux/amd64
Experimental: false

dockerを一般ユーザでも使用する設定

dockerグループを作成(dockerを入れたらたぶん自動でできてる)

$ sudo groupadd docker

dockerグループに所属させたいユーザを指定(例:hogehoge)

$ sudo usermod -g docker hogehoge

dockerの再起動

$ sudo /bin/systemctl restart docker.service

再起動ができたら一旦ログアウトしないと反映されない(一度接続しなおす必要あり)

nvidia-dockerを導入する

任意の作業フォルダに移動して作業を行う。

wget https://github.com/NVIDIA/nvidia-docker/releases/download/v1.0.1/nvidia-docker_1.0.1-1_amd64.deb

取得したファイルをインストールする。

$ sudo dpkg -i nvidia-docker_1.0.1-1_amd64.deb

サービスの起動確認

$ systemctl list-units --type=service | grep -i nvidia-docker
nvidia-docker.service                                 loaded active running NVIDIA Docker plugin

動作確認

$ docker pull nvidia/cuda:8.0-cudnn5-runtime
$ nvidia-docker run --rm nvidia/cuda nvidia-smi

Sat Apr  8 22:59:24 2017
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 375.51                 Driver Version: 375.51                    |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  Tesla M60           Off  | 8BEA:00:00.0     Off |                  Off |
| N/A   27C    P8    14W / 150W |      0MiB /  8123MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID  Type  Process name                               Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+

GPUの情報が表示されたらOK!

Dockerで動かす。

Dockerfileを作成する。

例えば下記のようなDockerfileを作成します。

FROM nvidia/cuda:8.0-cudnn5-runtime

LABEL maintainer "hogehoge@exmaple.com"

RUN apt-get update
RUN apt-get -y install python3-pip curl vim less
RUN pip3 install keras tensorflow-gpu sklearn chainer pillow h5py

Dockerfileからbuildを行う。

$ docker build -t nvidia_gpu .
  • vオプションでホスト側とコンテナ側の共有フォルダを設定します。この場合は~/hogehoge/sampleにしています。
$ nvidia-docker run --rm -i -v ~/hogehoge/sample:/share:rw -t nvidia_gpu /bin/bash

コマンド実行後コンテナの中に入るので、/shareフォルダに移動すると~/hogehoge/sampleの中にあるプログラムたちがいます。
あとはプログラムを実行するだけです。

$ python3 sample.py

顔認識付き受付アプリを作りました

何か作りたい!
何か作りたい!

そう思って、Pythonを使って顔認識付きの受付アプリをつくりました。

仕組みとしては、Kivyを使ってデスクトップアプリを作成し、OpenCVを使って顔認識を行い、画像と文章をslackに送信するという単純なものです。


f:id:yujikawa11:20170408203936p:plain

呼び鈴がボタンとなって、クリックすると下記のようにslackで画像付きで送信する感じです。

f:id:yujikawa11:20170408204045p:plain


会社の玄関にでも勝手に置こうかなぁ・・・w

Githubにソースおいています。好きに使ってください!

github.com

機械学習勉強会に参加しました!

こんにちは!

今回Oisixさんの機械学習勉強に登壇者の一人として参加しました。

oi-study.connpass.com


その時に使ったスライドを公開しておきます。

大したことはしてないですw

Kerasを使った画像分類というのが主な内容です。

色々あって突然参加することになったので、何をしようか色々考えた末、Oisixさんといえば新鮮な野菜→野菜の分類という安易な発想により葉物野菜の分類を始めました。
実際には1日ぐらいで実装や学習を行い、Fine-tuningを試したりもしたんですが、なぜかFine-tuningではうまくいかず(実装ミス?)、発表に間に合いませんでした。

東京でのLTも初めてで、さすが東京。人が集まりますね。福岡でイベントを行ってもなかなか集まらないですもんね。
勉強会も豊富なので、非常にうらやましいです。勉強会を福岡で増やすには自分から動くしかなさそうです。

なので今年もちょこちょこ勉強会できたらいいなぁ。(Pythonのコミュニティを作りたい・・)


発表スライド置いておきます↓

Kerasで画像分類を試してみる

実験内容

今回は下記のワンちゃんの画像を使ってImageNetの学習済みモデルで実験をしてみたいと思います。コード量は少なく、簡単にできるのでみなさん色々遊んでみてください!
f:id:yujikawa11:20170109152856j:plain:w200

Kerasをインストール

$ pip install keras

プログラム実装

from keras.applications.vgg16 import VGG16, preprocess_input, decode_predictions
from keras.preprocessing import image
import numpy as np
import sys

"""
ImageNetで学習済みのVGG16モデルを使って入力画像を予測
"""
# モデルの読み込み
model = VGG16(weights='imagenet')
# 入力画像のロード
filename = "./dog.jpg"
img = image.load_img(filename, target_size=(224, 224))
# 入力画像の行列化
x = image.img_to_array(img)
# 4次元テンソル
x = np.expand_dims(x, axis=0)
# 予測
preds = model.predict(preprocess_input(x))
results = decode_predictions(preds, top=5)[0]
# 結果出力
for result in results:
    print(result)

出力結果

('n02110806', 'basenji', 0.25577912)
('n02113023', 'Pembroke', 0.087493889)
('n02115641', 'dingo', 0.077256948)
('n02085620', 'Chihuahua', 0.062823117)
('n02113186', 'Cardigan', 0.0560412)

一番似ているのはバセンジー?
f:id:yujikawa11:20170109153218j:plain

写真の状態でだいぶ変わりますが、他の画像とかで遊んでみたらほとんど正解していましたよー!面白いですね。

このような画像分類を学ぶ際に参考にしたら良い本はこちらの本です。

[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]

ゼロから作るDeep Learning [ 斎藤 康毅 ]
価格:3672円(税込、送料無料) (2017/1/9時点)


機械学習用語メモ-随時更新-

バイアス

モデルの精度を意味する。学習不足により分類精度が悪いとバイアスが高いと言われる。

バリアンス

モデルの複雑さを意味する。モデルが複雑になりすぎて過学習を発生している場合にバリアンスが高いと言われる。

パラメトリックモデル

トレーニングデータセットからパラメータを推定する。元のトレーニングデータセットがなくても新しいデータ点を分類できるようになる。

例)

ノンパラメトリックモデル

固定のパラメータ集合で特徴付けることはできない。パラメータの個数はトレーニングデータセットとともに増加する。
例)

出川哲朗の名言をマルコフ連鎖を使って文生成してみた

文生成を手軽にやってみたくて、導入としてマルコフ連鎖を使った文生成をやってみました。 参考にしたページはこちらです。 d.hatena.ne.jp

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import random
import MeCab
import lxml.html
import requests

def wakati(text):
    t = MeCab.Tagger("-Owakati")
    m = t.parse(text)
    result = m.rstrip(" \n").split(" ")
    return result

if __name__ == "__main__":

    filename = "test.txt"
    # 出川哲朗の名言を取得しファイルに書き込み
    target_url = "http://meigen.keiziban-jp.com/%E5%87%BA%E5%B7%9D%E5%93%B2%E6%9C%97"
    target_html = requests.get(target_url).text
    root = lxml.html.fromstring(target_html)
    anchors = root.xpath('//p')
    f = open(filename,"w")
    for anchor in anchors:
        text = anchor.text
        if text == None:
            continue
        text = text.strip()
        if not text:
            break
        f.write(text)
    f.close()
    # てっちゃんファイル読み込み
    src = open(filename, "r").read()
    wordlist = wakati(src)
    markov = {}
    w1=""
    w2 = ""
    for word in wordlist:
        if w1 and w2:
            if (w1, w2) not in markov:
                markov[(w1, w2)] = []
            markov[(w1, w2)].append(word)
        w1, w2 = w2, word

    count = 0
    sentence = ""
    w1, w2  = random.choice(list(markov.keys()))

    while(count < len(wordlist)):
        if (w1,w2) in markov :
            tmp = random.choice(markov[(w1, w2)])
            sentence += tmp
            w1, w2 = w2, tmp
        count += 1

    print(sentence)

出力結果

ときに快感はすごいし…劇団からTVに出てきたいやいやダメでしょこれー!(板尾さんのことを)メニーメニピーポートークハウス、ポーキングパレス、ロンドンの3大トーク世界三大チキンの一つミッキーマウスはマウス、ドナルドダックはファッツ?どなるろらックナンバーワンドナルドダックドゥーユーノーガーガーチキン?メニメニ―ピーポー?メニメニピーポーマイジャパンセイセイ(大英博物館のことを)イングランド ヒストリー ホール(完結編のことを)メニーメニピーポートークハウス、ポーキングパレス、ロンドンの3大トーク世界三大チキンの一つミッキーマウスはマウス、ドナルドダックはファッツ?どなるろらックナンバーワンドナルドダックドゥーユーノーガーガーチキン?メニメニ―ピーポー?メニメニピーポーマイジャパンセイセイ(大英博物館のことを)かんけつせん(アメリカ人に対して)キャンユースピークイングリッシュ?ホワッツ珍魚?ギリギリまでカーマイがシャラップそれはガチ!ヤバいよ、ヤバいよ、ヤバいよ、ヤバいよ、ヤバいよ喉が赤ちゃんだからノーファック!あ~~!お尻・・・・・あ~~~~~~~!すごく感激してたら生きていけるよ!首以外の骨は全部折ってきてお笑いタレントになったパターンなんで純粋に分類すると、高田純次さんとか久本雅美さんと仲良くなって、芸人ってすげえなあって思うようになって、“あ、これ『アメトーーク!』だな”と(笑)座った椅子が壊れるとかでは、全然僕も気づいてなかった。ドライヤーから粉が出て、“あ、これ『アメトーーク!』だな”と『出川を探せ』じゃなくて『出川を探せ』じゃなくて『出川を探してから…』になっちゃってますからね趣旨が変わってるぞってことですよ。ブレすぎだろとでも湿布ってマジでしょ?見えたら笑えない才能なんかなくて『出川大陸』の第2弾だと気づいたんです。そうやって自分の中で納得して欲しいといったご要望にお応えしてきてお笑いタレントになって、チェン(内村)がいて・・・・・あなたを心から愛ちていまちゅ。結婚ちています。ここに入江がいて、南原がいて・・。こんな日が来るなんて、学生時代には考えられなかった・・・チョングムの誓い俺は、そうして欲しいといったご要望にお応えして欲しいといった人物等ございしたらお問い合わせフォームよりお送り下さいませ。弊社で調査を行い掲載可否を判断させていただきます。ここに入江がいて・・)Yes!チェ~ン!!食材はケチるな!惜しみなく用意せよ!世の中にある様々な名言や当サイトではこういうテーマの名言を掲載してからは、全然僕も気づいてなかった。ドライヤーから粉が出てきてお笑いタレントになったパターンなんで純粋に分類すると、高田純次さんとか久本雅美さんと仲良くなって、チェン(内村)がいて、芸人ってすげえなあって思うようになっちゃってますからね!ここのスタッフ頭おかしいだろ!(海外でマフィアに捕まり「お前は警察か?」と聞かれ、緊張のあまり・・・あなたを心から愛ちています。もし取り上げて欲しい、この人物の名言や格言集を掲載して欲しいといった人物等ございしたらお問い合わせフォームよりお送り下さいませ。弊社で調査を行い掲載可否を判断させていただきます。ここに入江がいて、南原がいて・・。こんな日が来るなんて、学生時代には考えられなかった。ドライヤーから粉が出てきてお笑いタレントになっちゃってて。隠れてるはずなのに、もう別にどっきりだな”と(笑)次の日もその次の日も何か起こるんだけど誰も出てこない。あまりに引っ張るんで、“あ、これ『アメトーーク!』だな”と(笑)座った椅子が壊れるとかでは、1度も無い俺の行き様を見てくれ!俺は英語ペロペロだからねワイだよ、ワイ!放送事故になったんです。そうやって自分の中で納得していまちゅ。結婚ちてくだしゃいNoStop!(海外でマフィアに捕まり「お前は警察か?」と聞かれ、緊張のあまり・・


てっちゃん相当狂ってやがるぜ・・・w今度は別の方法で文生成できるようにしよう。