動かざることバグの如し

近づきたいよ 君の理想に

CPU数が多いとTensorflow&kerasの機械学習が遅い件

概要

どういうわけか、CPUが多いサーバーだと学習に時間がかかるんじゃないかという話があった。そんなことないやろと思いつつ、公平にAWSベンチマークを撮ってみたが、やはりCPU数が多ければ多いほど遅くなってしまう。。

検証環境

nvidia-dockerを使ってCUDAの環境を構築し、その中でkeras公式レポジトリ内のexampleコードを実行して掛かった時間を計測する。

ちなみにgithubのレポジトリを使うとそれらがスクリプト化されている。

git clone https://github.com/thr3a/gpu.git
cd gpu
make build
make benchmark1 CPUS=0-1 # 使用するコアをCPUSで渡す デフォルト0のみ

babi_rnn.pyを実行したときのベンチマーク結果

FacebookのbAbIデータセットを用いた学習 自然言語処理系のはず

CPU数1個の場合

  • かかった時間 8分44秒
  • 1エポックあたりの平均 25秒

CPU数2個の場合

  • かかった時間 7分23秒
  • 1エポックあたりの平均 21〜22秒

CPU数4個の場合

  • かかった時間 7分37秒
  • 1エポックあたりの平均 22秒

CPU数8個の場合

  • かかった時間 8分06秒
  • 1エポックあたりの平均 24秒

結果2コアが1番速く終わることになる

cifar10_cnn.pyを実行したときのベンチマーク結果

いわゆる画像分類

CPU数1個の場合

  • かかった時間 5分18秒
  • 1エポックあたりの平均 31秒

CPU数2個の場合

  • かかった時間 4分14秒
  • 1エポックあたりの平均 25秒

CPU数4個の場合

  • かかった時間 4分40秒
  • 1エポックあたりの平均 27秒

CPU数8個の場合

  • かかった時間 5分11秒
  • 1エポックあたりの平均 30秒

これも2コアが一番速かった

結果

2つのベンチマークを表にすると以下

babi_rnn.py cifar10_cnn.py
1コア 8:44 5:18
2コア 7:23 4:14
4コア 7:37 4:40
8コア 8:06 5:11

うーんなにかUbuntu側の設定の問題なのか、Tensorflow(or keras)の仕様なのか、、謎

mysqlslapでMySQLサーバーの負荷テストをサクッと行う

環境

実はMariaDBにも同じコマンドが入っていたので仕様同じで使えるはず

やりたいこと

MySQLサーバーの負荷テストを「手軽」に行いたい

やれやれまたツールの選定作業か、、と思って探していたらどうも公式がツールを「mysqlslap」という名前で出しているらしい。てか入ってた。サンキューイルカ

公式ドキュメントいわく、

mysqlslap は MySQL サーバーのクライアント負荷をエミュレートし、各段階のタイミングをレポートする診断プログラムです。複数のクライアントがサーバーにアクセスしているかのように作動します。

とのこと。ポイントは「自動で負荷用のダミーDB、SQL」を生成してくれるところだと思う。

インストール

mysql-clientインストールしたら勝手に入ってると思う

実行

基本構文は以下

time mysqlslap \
--user=root \
--password=pass \
--engine=innodb \
--concurrency=10 \
--iterations=20 \
--auto-generate-sql \
--auto-generate-sql-load-type=mixed \
--number-char-cols=20 \
--number-int-cols=20 \
--auto-generate-sql-write-number=100000

各オプションの説明は以下

  • --user ユーザー名
  • --password パスワード 今回はローカル対象だが、別ホストを対象にテストをする場合は--hostが必要
  • --engine=innodb ストレージエンジン myisamとか
  • --concurrency 同時接続数 多くのユーザーからアクセスされていることを想定するならここの値を増やす
  • --iterations SQLの実行を何回行うか
  • --auto-generate-sql SQLを自動生成する
  • --auto-generate-sql-load-type=mixed INSERTとSELECT、UPDATEのコマンドをそれぞれ行う
  • --number-char-cols 1レコード内のVARCHAR型のカラム数
  • --number-int-cols 1レコード内のINT型のカラム数
  • --auto-generate-sql-write-number 最初にダミーデータを用意する際、レコードをどれだけ用意するか デフォルトだとかなり少ないので設定推奨

他にもオプションはいっぱいあるので公式ドキュメントをご覧くださいとしかいいようがない

実際に負荷テストする前にSQLを確認したい

オプションに --only-print をつけて実行するとSQLがバーっと術力される。

工夫すれば自前SQLでテストもできるらしいが、サクッとやるぶんにはauto-generate-sqlでも十分だと思った。

Unixドメインソケットをコマンドから生成する

一生に1回くらいの頻度で、Unixドメインソケットを自分で作りたいと思うことがあるはず(ない

コマンド

調べてみると、意外にもLinuxのコマンドでは生成できないらしい。

で、何故かPythonで作れた /tmp/test.sockに作りたいUnixドメインソケットの絶対パスを書く

python -c "import socket as s; sock = s.socket(s.AF_UNIX); sock.bind('/tmp/test.sock')"

他の言語でもできるっぽいけどPythonは必ずOSに入っているはずだから、メンテしやすいのかな、と。

そもそもなんでUnixドメインソケットをコマンドで作成する必要になったか覚えてないんだけど(

参考リンク

2019年上半期 買ってよかったモノまとめ

もう何日もすれば6月も終わる。つまり2019年の半分が過ぎてしまう。

半年を上半期/下半期と釘付け、買ってよかったものを備忘録としてまとめてみる。

基準としては「その期間中に初めて買って個人的によかったもの」とする。

目薬 サンテビオ

シミないタイプの目薬 めっちゃパッケージが地味なのでドラッグストアで探しづらい

【第2類医薬品】サンテビオ 15mL

【第2類医薬品】サンテビオ 15mL

仕事上どうしても目がつかれるので頻繁に目薬を買ってるのだが、いつも買ってるのが無かったのでたまには別と思って買った。(ロートは飽きたので別のメーカーにしようと思った

で、買ったのがこれ。他の目薬よりドライアイに効くし、ピントが合いやすくなる(個人の感想

ただし液体が赤みかかってるので服につかないように差すときに注意しないといけない

ルックプラス バスタブクレンジング

風呂洗うのに使うやつ

駅の広告で見て気になって買った。宣伝文句は「バスタブをこすらなくもきれいになる」 結論から言うと流石にコスり不要は言いすぎと思いつつ、確かに今まで使ってた洗剤よりコスらなくても落ちる。

ので自分みたいに風呂掃除ダルいマンにはおすすめ

MacbookSSD TS960GJDM850

今個人で使ってるMacbookPro 2015のSSDの増設用に買った。もともと128GBだったのでかなりキチキチだったのと、ここ最近のMacbookの出来をみて当分買い換えることがなさそうだったので買った。

自分のときで50000円いかないぐらいだった。

ポイントは「TS960JDM820」ではなく「TS960GJDM850」であること。JDM820の後継バージョンとしてJDM850シリーズがリリースされ、インターフェイスAHCIからNVMeに変更されたので速くなったとのこと(公式サイト

結果的に快適に使えるようになったので満足 どれ位早くなったかのベンチマーク撮ったはずだが消えてた(

(ちなみに日本にあまり流通されてないのでAmazon.comから個人輸入したほうが絶対安い

エーザイ チョコラBBハイパー

口内炎に効く(個人の感想です

口内炎がひどかったときに勧められて試してみたら効果てきめんだったのでリピートしてる。

ポイントはチョコラBB「ハイパー」である点。他にも無印、ライト、ローヤル等々同じブランドでもいくつも種類があるが、効果&味ともにハイパーが一番最強な気がする。

もちろんその分値段もするが、ドラッグストアだけじゃなくてコンビニでも変えるので口内炎f**kのときにはぜひ

cheero Power Plus モバイルバッテリー(CHE-096)

軽さは正義 ダンボーは好み

今まで使ってきたやつがヘタってきたので買い替え。そうそう買い替えないのでType-C対応&PD充電対応で調べてたらcheeroから発売されてたので買った。

ポイントは「軽さ」 普段リュックとか手提げに入れて使ってるのでなるべく軽いほうが助かる。(とはいえ5000mAhだと若干不安なので10000mAhはほしい。)

これは約185gだが、Amazonでタイムセールしているやつは結構重かったりする。。cheeroは比較的軽めのモバイルバッテリーが多いのですき

マイナス点は機能としてケーブルを挿すだけで充電が始まる(ボタンを押す必要がない)のだが、ごく稀に充電されずにあ〜ってなったことがあった。ちゃんと確認しておけって話だが。

価格だがAmazonだとクッソ高いのでおすすめしない 秋葉原で税込み4000円でお釣り来たので現地で買ったほうがよさげ

ダンボーくんあんまり好きじゃないって場合はこれとか同機能なのでいいかも(何故かダンボーくんより20g重いが

Amazon | cheero Power Plus 5 10000mAh with Power Delivery 18W (Metallic) 大容量 モバイルバッテリー (パワーデリバリー対応) 2ポート出力 Type-A Type-C 対応機種へ超高速充電 iPhone, Android, Galaxy, AUTO-IC搭載 PSEマーク付 Power Delivery 3.0 対応 CtoCケーブル付 CHE-101 | モバイルバッテリー 通販


他にもあったかもしれないが忘れた

リアルタイムに手を検出できるJavascriptライブラリ「handtrack.js」

TensorFlow.jsというのがあって、これはTensorflowで作成したモデルをブラウザで使えるようにできるライブラリなのだが、これを利用して手の検出をリアルタイムにブラウザ上で行えるライブラリを使う機会があったのでメモ。

その名もhandtrack.js

サンプルコード

必要最低限の動くコード。HTMLにcanvasとvideoタグがあるが、WEBカメラで取得した映像をvideoタグに反映させて、そこから手を検出した画像がcanvasに反映されていく。試したほうが速い

<div id="message">loading model...</div>
<canvas id="mycanvas" width="640" height="480"></canvas>
<video id="myvideo" width="640" height="480"></video>

<script src="https://cdn.jsdelivr.net/npm/handtrackjs@0.0.13/dist/handtrack.min.js"></script>
<script>
const canvas = document.getElementById('mycanvas');
const context = canvas.getContext('2d');
const video = document.getElementById('myvideo');
let model;
const options = {
  flipHorizontal: true,   // flip e.g for video  
  maxNumBoxes: 3,        // maximum number of boxes to detect
  iouThreshold: 0.5,      // ioU threshold for non-max suppression
  scoreThreshold: 0.7,    // confidence threshold for predictions.
};
handTrack.load(options).then(l_model => {
  model = l_model;
  document.getElementById('message').innerText = 'loaded!';
  handTrack.startVideo(video).then(function (status) {
    if (status) {
      console.log("video started", status);
      runDetection();
    } else {
      console.log("video error", status);
    }
  });
});

function runDetection() {
  model.detect(video).then(predictions => {
      console.log("Predictions: ", predictions);
      model.renderPredictions(predictions, canvas, context, video);
      requestAnimationFrame(runDetection);
  });
}
</script>

ポイントはいくつかって

オプションの

  • flipHorizontal WEBカメラ経由とかだと鏡になるので左右逆になる これを補正するかどうか
  • maxNumBoxes: 3 一度に最大どれだけの手を検出するか
  • iouThreshold: 0.5 うーんわからん
  • scoreThreshold: 0.7 手とみなすしきい値 1に近ければ近いほど確からしくないと手として認めてくれなくなる

で、

  • handTrack.load()
  • handTrack.startVideo()
  • model.detect()
  • model.renderPredictions()
  • model.renderPredictions()

の順番に実行していく

細かいところは公式のREADME見たほうがいい というかそれしかないが