docker関連のerrorと対処法集

dockerを勉強し始めて,詰まった部分などを書き溜めていく.
同じエラーで詰まった人の助けになれば幸いです.
エラーに遭遇する度に追加していく予定

tips

  • 何かしらのエラーでうまく動かないときは,docker logs [container id]でログを見ることができる.

  • unicornのエラーは標準出力には出力されなかったので,直接エラーログファイルを見に行く必要があった.
    例えば,以下のようなエラーの場合は,unicorn系のエラーだったのでrun bashで内部に入って,同様のコマンドを実行してエラーログファイルを参照した.

[error] 5#5: *11 connect() to unix:/share/unicorn.sock failed (111: Connection refused) while connecting to upstream, client: 192.168.99.1, server: , request: "GET / HTTP/1.1", upstream: "http://unix:/share/unicorn.sock:/", host: "192.168.99.104"
  • eval $(docker-machine env default)
    dockerの接続先を指定するためのコマンド.(この場合は指定先をdefaultにするコマンド)
    ターミナルが変われば,この接続先は再指定する必要がある.
    逆に,ターミナルごとに接続先を指定できる.
    docker-machine lsでACTIVEにマークがついているかちょくちょく確認したほうがよい.

docker-machine起動関連のエラー

  • error
$ docker-machine env default
Error checking TLS connection: Host is not running
  • 解決法
    docker-machineが起動していなかった.
$ docker-machine start default

  • error
$ docker-machine env default
Error checking TLS connection: Error checking and/or regenerating the certs: There was an error validating certificates for host "192.168.99.101:2376": x509: certificate is valid for 192.168.99.100, not 192.168.99.101
You can attempt to regenerate them using 'docker-machine regenerate-certs [name]'.
Be advised that this will trigger a Docker daemon restart which might stop running containers.
  • 解決法
    前起動していたときとIPが変わっているために発生するエラー.
    エラー文に書いているが,
$ docker-machine regenerate-certs default
Regenerate TLS machine certs?  Warning: this is irreversible. (y/n): y
Regenerating TLS certificates
Waiting for SSH to be available...
Detecting the provisioner...
Copying certs to the local machine directory...
Copying certs to the remote machine...
Setting Docker configuration on the remote daemon...

これで起動する.


  • error
$ docker-machine regenerate-certs default
Regenerate TLS machine certs?  Warning: this is irreversible. (y/n): y
Regenerating TLS certificates
Waiting for SSH to be available...
Too many retries waiting for SSH to be available.  Last error: Maximum number of retries (60) exceeded
  • 解決法
    docker-machineを起動していない.
$  docker-machine start default && docker-machine regenerate-certs default

docker/docker-machine/docker-compose/docker-swarmを学ぶときにわかりやすかった資料達

なにか

Dockerって開発環境構築するときに使うとナウいんでしょ?程度の知識しかない初心者が,Dockerについて学んだときにわかりやすかった資料をまとめたものです.

上から順に読んでいくとわかりやすいと思います.

docker

一言で言うと,dockerはバージョン管理しながらプロセス単位で仮想化するもの

1〜6まである.仮想化とは?から順にdockerのメリットややっていることが理解できる. qiita.com

docker-machine

一言で言うと,docker-machineはdockerの開発環境を作るもの&管理するもの(virtualenv的なもの?).

knowledge.sakura.ad.jp

docker-compose / docker-swarm

一言で言うと,docker-composeは複数のdockerコンテナを管理するもの. docker-swarmは複数のマシンでdockerコンテナを管理するもの.

https://www.slideshare.net/zembutsu/introduction-to-docker-compose-and-swarm

dockerの問題点

Dockerの諸問題とRocket登場の経緯 | SOTA

以下使用に関する記事

dockerのコマンド

qiita.com

dockerの使用例

dockerfileの開発Tips

qiita.com

Dockerfile のベストプラクティス — Docker-docs-ja 1.9.0b ドキュメント

nginx + mysqlで簡易アプリ作成(みただけ)

qiita.com

docker-machine + docker-compose + docker-swarmの使用例(ちょっと古い)

qiita.com

サービス開発参考

qiita.com

pandas便利な使い方メモ(随時更新)

pandasの便利な使い方を毎度調べたり試行錯誤したりするのは効率が悪いのでここに雑に書き溜める。
もしおすすめの使い方やもっと効率のいい方法などあれば教えていただきたいです!

DataFrame内のあるカラムにある文字列が含まれている行だけ取り出す

要は'hoge' in textTrueになる行だけ選択してくる。

df[df['text'].apply(lambda x: 'hoge' in x)]

同じ要領で、キーが複数ある場合。('hoge', 'huga', 'hogu'で選択してきたい場合)

df[df['text'].apply(lambda x: any([key in x for key in ['hoge', 'huga', 'hogu']))]

あるカラムがnullだったら削除する

df = df.drop(df[df['nanika'].isnull()==True].index)

csv読み込み

df = pd.read_csv(path, names=('hoge', 'huga', 'hogu'), delimiter='nanika')

merge

new = pd.merge(df1, df2, left_on='hoge', right_on='hoge') # カラムの値が一致するものでマージする

shuffle

df = df.reindex(np.random.permutation(df.index))

histogramのxlimを設定する

h = data.hist(column='nanika')
h[0][0].set_xlim(-10, 10)

(おまけ)numpy編

条件に一致するものだけ置換する

値が5以上のものを0に置換する

x[ x >= 5 ] = 0

pandasで値の順位を取得したい(おまけにソート方法いろいろ)

pandasでDataFrameにorderを付与したいときのメモ

状況

↓こういうDataFrameに対して、testカラムの値が並び替えた時に何番目になるのかを知りたい

   test
0     1
1     4
2     6
3     3
4     2
5     7
6     9

具体的には、こういう結果がほしい

   test  order
0     1      0
1     4      3
2     6      4
3     3      2
4     2      1
5     7      5
6     9      6

値で並び替える方法はたくさんあるし、並び替えた時に何番目にすればいいのかのindexを取得してくる方法もたくさんあるが、 並び替えた時に何番目になるのかを取得してくる方法が意外となかった。(みんな考えるまでもないのだろうか?)

解決方法

追記

以前の方法(↓に書いてある方法)では同値を適切に扱えてなかった。 scipyを使うとめちゃくちゃカンタンにできた。 stats.mstats.rankdataという関数がそれ。

from scipy import stats
test = np.array([1,4,6,3,2,7,6])
a=pd.DataFrame(test, columns=(['test']))
a = a.assign(order=stats.mstats.rankdata(a.test))

で実現できる

以下のような出力が得られる。同値は小数で表示される。 (この例の場合、indexが2と6のところで5位タイが存在するが、5.5位として表示される)

   test  order
0     1    1.0
1     4    4.0
2     6    5.5
3     3    3.0
4     2    2.0
5     7    7.0
6     6    5.5

以下追記前の方法

(雑だが)aというDataFrameのtestカラムで並び替えた時の順位が知りたい場合、

np.argsort(a.sort_values('test').index)

で取得できる。

全体はこんな感じ

test = np.array([1,4,6,3,2,7,9])
a=pd.DataFrame(test, columns=(['test']))
a = a.assign(order=np.argsort(a.sort_values('test').index))

上のような結果が得られる。

おまけ

単純に並び替える

>>> a.sort_values('test')
   test
0     1
4     2
3     3
1     4
2     6
5     7
6     9

並び替えた時のインデックスを取得

たまにインデックスだけほしくなる。

>>> a.sort_values('test').index.values
array([0, 4, 3, 1, 2, 5, 6])

こうすれば並び替えることができる。

>>> [a.get_value(i, 'test') for i in a.sort_values('test').index]
[1, 2, 3, 4, 6, 7, 9]

こういう用途であればそもそもこれで完結するが、

>>> a.sort_values('test').test.values
array([1, 2, 3, 4, 6, 7, 9])

以上、メモでした。

rubyでjupyter notebookを使う

rubyでjupyter notebookが使えるというのを発見したので,環境構築してみたがはまったので,改めて環境構築方法を記す.

環境

MacBookPro
macOS Sierra 10.12.3

やったこと

※ここでやったことはうまくいかなかった方法で詰まっている方向けなので,これから環境構築する方は後半を見てください.

とりあえず見つけた以下の記事通りにやってみた.

Railsエンジニアに役立つJupyter NotebookとiRuby - クックパッド開発者ブログ

$ pip install jupyter # python, pip環境が整っていない方は別途整えてください
$ gem install iruby
$ ruby register # これが動かない
$ iruby register # たぶんこう
$ jupyter notebook # jupyter notebookが立ち上がり,rubyを選択できるようになってる!

無事,jupyter notebookを立ち上げ,rubyカーネルを選択することでできるようになった.
しかしここで問題が.
rubyカーネルを立ち上げ使おうと思ったらうまく立ち上がらない.
ターミナルをみると以下のようなエラーが.

dyld: lazy symbol binding failed: Symbol not found: _zmq_poll
  Referenced from: /usr/local/lib/libzmq.dylib
  Expected in: flat namespace

dyld: Symbol not found: _zmq_poll
  Referenced from: /usr/local/lib/libzmq.dylib
  Expected in: flat namespace

ググってるといろいろな解決法が挙げられていたが最終的には以下の記事が解決してくれた.

Mac で IRuby Notebook 環境を構築する方法 2017年版 - Qiita

ちなみに EI Capitanであればこの記事を見ると良さそう.

結局どうすればよいのか

いろんな記事でrbczmqをインストールするよう書いてあるがこれがコケてめんどくさい.
上の記事によるとインストールする必要がないようで,以下のようにするとうまくいく.

$ brew uninstall --ignore-dependencies zeromq # installしていたらuninstallする
$ brew uninstall czmq # 上に同じ
$ brew install zeromq --HEAD # --HEADをつけて最新版を取得する必要がある!!!
$ brew install czmq --HEAD
$ gem install cztop # rbczmqの代わり?

次に,cztop supportをインストールする.

$ gem install specific_install
$ gem specific_install https://github.com/SciRuby/iruby.git
$ iruby register --force

これで環境は整った!!

$ jupyter notebook

起動後,rubyカーネルを選択すればOK!
これで快適なrubyライフが送れますね!!

python並列処理による機械学習の高速化の試み

機械学習をしていると処理の遅さに悩まされることが多々ある.
私は画像系のdeep learningを扱うことが多いので,頻繁に悩まされている.

高速化するにあたってNetworkの処理自体はGPUに任せるしかないので,それ以外でGPUの足を引っ張らないようにするのが大事だと思う.
今回は画像の読み込みを並列で行うことで処理時間の短縮ができるのではないかと思い,やってみた.

この記事でやったこと
* multiprocessingモジュールの簡単な使い方の説明
* Poolクラスを用いて,画像読み込みの並列化&速度測定
* Process, Queueクラスを用いたCNNの処理時間高速化の試み

注意点

Desktop(Ubuntu)とMacBookProで試したのですが,結果が異なってしまったので,あっているのか自信がない…
実装の参考までにしてください.
間違っている点があれば教えていただけると幸いです.

環境

Ubuntu 16.04
プロセッサ: 3.0GHz Core i7
コア数: 16

Pythonにおける並列処理

並列処理には大きく,Threadによる並列化(メモリ共有)とProcessによる並列化(共有なし)があるが,pythonではGIL (Global Interpreter Lock)というインタプリタ上で一度に一つのスレッドのみが動作することを保証する機能があり,Threadによる並列化ができないらしい.

そのため基本的にProcessによる並列化を行う.

multiprocessingモジュール

pythonではmultiprocessingモジュールが提供されており,これを用いることで並列化できる.
[document]

使い方

基本的にはPoolというクラスを用いて以下のように使う.
並列化してもちゃんと順番通りに処理してくれる.

画像読み込みの並列化

以下のように実装した.

結論としては,マルチプロセスにすることで処理速度は向上したがそれほど大きな違いはなかったので,”絶対に並列化するべき!”というほどではない.
が,そんなに難しくない処理なので導入しておくにこしたことはないと思う.

ちなみに,画像読み込み枚数を100, 500, 1000としつこいくらいに細かく調べているのは初めにMacBookProで試したときに想定外の結果がでたので,細かく調査していた名残です.
プロセス数を4にしているのも同様の理由.16にするともっと大きな差がついていた.

CNNでの予測処理高速化の試み

process,queueを用いて,画像の読み込みとCNNでの推定処理を並列に行った.
実装は以下のようにした.(CNNでの推定用コードは省略)

結論としては,並列で画像を読み込んだほうが速いということがわかった.
Process, Queueの導入は逆効果である.という結果がでたのだが,ちょっと納得いかない..
もう少しうまく処理する方法はないのだろうか..

まとめ

multiprocessingモジュールのPool, Process, Queueクラスを用いた並列処理の実装サンプルを示した.
結果,並列化することで処理の高速化を実現できることがわかった.
一番良い方法が並列で画像を読み込む方法だったのだが,Process,Queue等他の方法でもっとうまくやれる方法がある気がする.
間違いがあればご指摘いただけると幸いです.

おまけ

Ubuntuで行う前にMacBookProで試した結果.
Macでは並列化することで悪影響を与えていたので,もしかすると環境次第では並列化しないほうが速いかもしれないので,ご注意ください.

Macで行ったときの結果

Macの環境

Mac Book Pro
プロセッサ: 2.7GHz Core i5
コア数: 4

実行時のエラー出力をファイルに書き出す

エラーログが多すぎて流れきってしまってエラーを追えないときに困ったのでメモする

エラーログは以下のコマンドでファイルに出力できる.

$ [command] 2>log.txt

2標準エラー出力1は標準出力.
ちなみに両方出力する場合は,

$ [comannd] 1>log.txt 2>&1 # こうする
$ [comannd] 1>log.txt 2>log.txt # これは上書きしてしまうので間違い