nkmrtty’s blog

https://nkmrtty.com/

Timezone on Kibana

While Kibana uses the timezone detected by the browser as default, Elasticsearch stores the timestamp of a document in UTC. In addition, Kibana shows the timestamp as MMMM Do YYYY, HH:mm:ss.SSS; it does not contain the timezone information. This is very confusing when handling UTC timestamps in other timezones, e.g., JST.

To ensure Kibana shows timestamps in UTC, the following Advanced Settings are required:

  1. dateFormat:tz = UTC
  2. (optional) dateFormat = MMMM Do YYYY, HH:mm:ss.SSS, z

お手軽ツイート収集基盤(Docker+Elasticsearch+Kibana+Logstash)

タイトルの通り、Elastic Products on Dockerでツイート(Sample Tweet API)の収集基盤を作ったお話。

内容としてはココの話をDockerでやっただけです。

confファイル書くだけでsampleのツイートを収集できるので非常にお手軽。いままでPythonで頑張っていたのは何だったのだ......

なお、本記事の手順で構築した基盤ではCPUの使用率がCore i5 6500で200%弱(topコマンドの値)になるので自宅のPC等で利用するのはおすすめしません。

Elastic Products on Dockerの細かい設定方法等についてはElasticの公式ドキュメントを熟読してください。

今回の環境

  • Ubuntu 16.04.4 LTS
  • Docker version 17.12.1-ce, build 7390fc6
  • docker-compose version 1.18.0, build 8dd22a9
  • Elastic Productsのバージョンは6.2.2で統一
  • Twitter APIの各種キーは事前に取得済

ディレクトリ構成

.
├── docker-compose.yml
├── elasticsearch
│   └── data
└── logstash
    └── pipeline
        └── twitter.conf

各種設定ファイル

Gistにアップロードしてます。Logstashでは標準でTwitterのストリームデータを扱うためのプラグインが提供されているのでそれを使います。

Easy tweets collection system = Docker + Elasticse ...

起動

docker-compose up -dで楽々起動。localhost:5601でKibanaにアクセスできます。

メモ

  • 今回はElasticsearch、Kibana、Logstatshを一元管理していますが、使い勝手的にはLogstashは用途ごとに別々で起動したほうが使いやすいと思います。
  • 生データのツイートをそのままElasticsearchに投げているのでCPU、ディスクともに負荷がすごいです。ココらへんを参考に必要な属性に絞ってElasticsearchに投げるのが良いかと思います。

最後にツイートが溜まっていく様子を眺めます。おわり。

Lights Out

ライツアウト自体はどういうものか知ってはいたんだけど、アルゴリズムがさっぱりで悔しかったので勉強した。

問題設定としては以下の通り。

N行M列に並べられたN×M個のライトがあり、それぞれのライトはONとOFFの2つの状態を持つ。 ライトをタップすることでONとOFFを切り替えられるが、その時、そのライトの上下左右のライトのONとOFFも同時に切り替わる。 与えられた初期状態から何回かライトをタップしてすべてのライトを消すための手順を求めよ。  
[入力形式]
N M
(ライトの初期状態:0がON/.がOFF)  
[入力例]
5 5
.....
.....
..0..
.....
.....

求められる答えとしては最小のタップ数であったり、すべての手順数であったり。

まず、以下のことが直感的にわかる。

  • 同じライトを偶数回タップしても結果は同じ(各ライトはタップするかしないかの2択)
  • ライトを押す順番が変わっても結果は同じ

つまり、単純な総当りだと {O(2^{N\times M})} の時間計算量になる。

総当りのときのPythonコードはこちら。盤のサイズでON/OFF用のマスクビット列が決まるので、ON/OFFの処理を高速化できる余地はあるけどタダのテクニックなので割愛。

Lights Out

これをどうにか高速化できないかという話なんだけど、そんなん自分の頭じゃわかんないですってやり方だった。
具体的な内容については参考サイトを見てほしいんですが、1行目のどのライトをタップするかが決まればすべてのライトを消せるかどうかがわかると言うもの(わからん)。
直感的には1行目のライトをOFFにするには、1行目のONのライトの下にある2行目のライトをタップしないといけない、2行目のライトをOFFにするには.....、という操作をしないといけないのでという感じ。
これで時間計算量は1行目のライトの組み合わせと2行目以降で上段がONのライトの探索なので {O(MN2^{M})}になるのかな。

コードはこちら。めっちゃ早い。

Fast Lights Out

おわり。

参考サイト

GPGPU環境作り改

先日、表題の通りの記事を書いたわけですが、この手順だとnvidia-settingsコマンドを使ったGPUオーバークロックができなくてずっと困っていた(半年ぐらい)。

nkmrtty.hatenablog.com

DeepなML使ったDataのマイニングにも十分興味はあるのですが、Goldのマイニングにも興味があってそれまでは専用設定がすでにされたUbuntuイメージを使っていたわけです。

今回、やっと自分で構築した環境でGPUオーバークロックができるようになったので改めてUbuntuクリーンインストールされた状態からの手順についてまとめます。

GPUオーバークロックについては自己責任でお願いします。

想定環境

基本的にローカルでの作業になります。

前準備

NvidiaドライバとCUDAをそれぞれDLしておく。

Nouveauドライバの無効化

/etc/modprobe.d/blacklist.confに以下を追記。ほぼ前回と同じ。

blacklist nouveau
options nouveau modeset=0

反映させて再起動する。

$ sudo update-initramfs -u
$ sudo reboot

Nvidiaドライバのインストール

Alt+Ctrl+F1Virtual Consoleを起動する。

X-serverを止めます。

$ sudo service lightdm stop

ドライバをインストールします。

$ sudo /path/to/NVIDIA-Linux-x86_64-384.90.run

再起動後、nvidia-smiコマンドが動作すればドライバのインストールは完了です。

ダミーディスプレイの設定

詳しくは省略しますが、以下の呪文を唱え、再起動します。

$ sudo update-grub
$ sudo nvidia-xconfig -a --allow-empty-initial-configuration --cool-bits=31 --use-display-device="DFP-0" --connected-monitor="DFP-0"

すると、なんと不思議なことに

オーバークロックができるようになります。こんな感じで。

$ nvidia-settings -a "[gpu:0]/GPUPowerMizerMode=1"
$ nvidia-settings -a "[gpu:0]/GPUFanControlState=1"
$ nvidia-settings -a "[fan:0]/GPUTargetFanSpeed=80"
$ nvidia-settings -a "[gpu:0]/GPUGraphicsClockOffset[3]=100"
$ nvidia-settings -a "[gpu:0]/GPUMemoryTransferRateOffset[3]=100"

簡単に説明すると、nvidia-smi0番目のGPUに対して、

  • 冷却ファンのスピードを80%に固定
  • コアクロック+100MHz
  • メモリクロック+100MHz

です。

このコマンド、SSH経由では実行できないのが今の悩み。調べている範囲ではDISPALY=:0とすればいいだけらしいんですが、この手順で作成した環境ではムリでした。だれか教えて。

CUDAのインストール以降

ここからChainerのサンプル動かすまでは前回の記事と同じ手順です。

感想

パッケージマネージャに頼るな。暖房いらない。

mysqlの文字列まわり

男は黙って utf8mb4 and utf8mb4_bin

[mysqld]
character_set_server=utf8mb4
collation_server=utf8mb4_bin

あとUNIQUE制約下で文字列末尾の空白の存在が無視されるのも仕様? そういうのは基本不正な文字列なので無視すればいいんだけどとりあえずDBに突っ込んどきたいときに対処が面倒くさい

初Docker?

Amazon Route 53でDynamic DNSを行うためのDockerイメージを作成した。

イメージ作成からまともにDocker触るのはこれが初めて。

イニシャルコストが高いのは否めないけど、細々とした動作をさせるのには楽だなぁ。

GPGPU環境作り

(2017/12/16更新)GPUオーバークロックができる手順についてまとめました nkmrtty.hatenablog.com


環境作るたびにいろんなガイド見比べてる気がしてるから自分でまとめる。CUDAがNvidiaドライバのバージョンを指定してくるので、各レポジトリを追加してCUDAをインストールする、という流れが一番手間が少ないようだ。

今回の環境

  • Ubuntu Desktop 16.04.3 LTS
    • インストール直後を想定
  • GeForce GTX 1060 x1
  • GeForce GTX 1050Ti x1

前準備

デフォルトのグラフィックドライバを無効化する。デフォルトのドライバが使用されているかどうかは以下のコマンドでわかる。

$ lsmod | grep -i nouveau

無効化するスクリプト/etc/modprobe.d/blacklist-nouveau.confを作成する。

blacklist nouveau
options nouveau modeset=0

反映させて再起動する。

$ sudo update-initramfs -u
$ sudo reboot

レポジトリの追加

NvidiaドライバとCUDAのレポジトリを追加する(Nvidiaドライバのレポジトリはいらないかも)。 CUDAについては、Nvidia DeveloperからdebファイルをDLしておく。バージョン等は適当に読み替えてください。

$ sudo add-apt-repository ppa:xorg-edgers/ppa
$ sudo dpkg -i cuda-repo-ubuntu1604-9-0-local-rc_9.0.103-1_amd64.deb
$ sudo apt-key add /var/cuda-repo-9-0-local-rc/7fa2af80.pub
$ sudo apt update

CUDAのインストール

今回はnvidia-384が一緒にインストールされた。

$ sudo apt install cuda

パスの設定もしておく(必須なのかよくわからない)

export PATH=/usr/local/cuda/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH

cuDNNのインストール

cuDNNをダウンロードして所定の場所にインストール。

tar xzf cudnn-9.0-linux-x64-v7.tgz
sudo cp -a cuda/lib64/* /usr/local/lib/
sudo cp -a cuda/include/* /usr/local/include/
sudo ldconfig

rm -R -f cuda cudnn-9.0-linux-x64-v7.tgz

動作テスト

Chainer動かすまで。

$ sudo apt install git python3-venv python3-dev
$ python3 -m venv chainer
$ source chainer/bin/activate
$ pip install cupy chainer
$ git clone https://github.com/chainer/chainer.git
$ cd chainer/examples/mnist/
$ python train_mnist.py --gpu=0

メモ

  • 記事作成時点の最新ドライバはnvidia-387
  • nvidia-384以降、GTX 1050Tiの消費電力量が表示されないバグ?があるっぽい(参考)。レポジトリから選べるドライバだとnvidia-381以前なら正常に表示される。しかし、CUDAインストール時にnvidia-384に置き換えられちゃうのでとりあえずこのままで。