shuntaro3.log

技術ネタとか。

トイレは会社の縮図である

◆ はじめに

会社にはトイレがある。

トイレを観察すれば、その会社のマネジメントレベルがわかるし、所属している社員のモチベーションもわかる。逆に、どうすれば改善できるのもわかる。信憑度は占いレベルだ。だがしかし、「トイレは会社の縮図」である。

僕はトイレ掃除が好きだ。学生時、掃除時間に「どれだけトイレを綺麗にできるか」を真剣に考え、掃除をしていた記憶がある。そのため、友人から「トイレマスター」の称号を頂戴した。ジェダイナイトならぬトイレナイトである。だからこそ、トイレに残る些細な情報(汚れ)にも意味を見出してしまうのだ。

ちなみに、ただのネタであり、愚痴である。注意いただきたい。意見の偏りは凄い。

◆ 悪い兆候

トイレを観察すれば、その会社のことがわかると書いた。では、どのようなことがわかるのか、悪い兆候を例に挙げながら説明していきたい。

* トイレ掃除当番が明確に決まっていない

トイレ掃除当番が決まっていないということは、誰かが自主的に掃除をしなければ、掃除がされない状況である。掃除は新入社員がやるものだろ、とか、早く出社した人がやればよくない、とか、掃除好きはほっといてもやるだろとか。どのケースにしろ、昔からの通例、暗黙の了解、自主性依存といった、"やるやらない"を現場の"誰か"に丸投げしてしまっている。

こういった場合、仕事においてもマネジメントがうまく機能していないことが多い。そもそも会社の時間内に掃除時間がある以上、掃除=業務である。その認識においていえば、"誰か"に丸投げしている時点で、業務におけるマネジメントを放棄していることになる。いやいや掃除は業務じゃないから、ということであれば社員がやらなくて済むように業者を頼むなりする必要がある。やはり放棄している。

* 汚したまま放置する

トイレを使用するとき、意図せず汚してしまうことはあるだろう。問題は、汚してしまった後どういう行動が取られているか、ということだ。

1) 汚した本人が掃除している

素晴らしい。僕が無駄なネタブログポストをする必要がなくなる、優しい世界。チームメンバー間の信頼関係も築けており、社員のモチベーションも高い。

2) 汚れを放置しだす

心に余裕がなくなっている、もしくは傲り高ぶっている。社員のモチベーションは低く、卑屈な状態だろう。

3) わざと汚す

わりとまじでやめて。

* トイレが汚い

行き着く先である。誰かが改善アクションをとらないとどうしようもないレベルになっている。マネジメント?モチベーション?そんな話ではない。

◆ どう改善していくか

* 仕組み化

人は弱い生き物であり、変化を嫌う。なので、外部的に無理やりやらざるを得ない環境にし、それを継続、習慣化してしまうのが改善の近道だと思っている。いわゆる仕組み化だ。

トイレ掃除だと、掃除当番表を作成し、やるだけ。あら、簡単。

* 明確化

仕組み化と似た話にはなるが、以下2点を明確に定義するのが良いと思っている。

1) 責任者

誰が、どういうミッションを担っているか、ということ。任された当人としてはミッションを達成する責任感が増し、推進もしやすい。皆、問題意識はあるが、誰も手をつけないみたいな状況を回避できる。

トイレ掃除のミッションは、トイレを清潔に保ち、気持ちよくトイレができる環境を社員に提供することである。このミッションを誰が担うかを決めれば良い。

2) 評価指標

1だけだと弱いので、ミッションに対してどうなったら良いのか、の指標もあると良いと思う。できているのか、いないのか、判断できるし、PDCAも回しやすい。

トイレ掃除でいうと、以下が指標かと思う。 - 毎日トイレ掃除ができている - トイレから嫌な匂いがしない - 汚したら自分で掃除する文化になっているか

* 戦う意思を持つ

トイレ掃除がちゃんとできない会社の文化と戦う意思を持つのも重要。会社の文化はそこに所属する社員によって構築されるものなのである。よって、戦う相手は「社員」である。うまくいっていない原因は、「社員」のどういう振る舞いからなのか、発言からなのか、よく見極めて、意見や改善指摘をしてく必要がある。それをすることで、会社に居づらくなる一方なら、多分会社と自分がFitしていないということなんだと思う。新天地を探せば良い。

◆ まとめ

改めて書くが、ネタである。ネタ的に書いてみたが、それっぽくなったので満足している。社員がトイレ掃除をすべきといった精神論ではない。ネタだ。僕が掃除が好きなだけだ。

「トイレは会社の縮図である」。ネタであることを祈る。

Windows10でKeras+TensorFlow(GPU)環境を作る

f:id:shuntaro3:20170816233718p:plain

◆ はじめに

猫も杓子もディープニューラルネットワーク(DNN)という時代。 技術に疎い上司も「AIがーAIがー」と毎日言っているので、本当にすごい時代になったなと思う。

同僚とも、とりあえずなんかやってみたいよねー的な話をしてたら、 うちの会社、紙データの入力業務とかしてまして、それをDNNで手書き文字認識で自動化したら良くね?という案が出た。 DNN入門としては良い課題。これはやってみるっきゃない、ということで3人くらいで休日を使って、ちまちまと開発したり、テストデータ作ったりしていた。

最初のうちは良かったが、学習データが10,000件を超えたあたりで、学習にかかる時間が2時間くらいかかりだして、結構馬鹿にならなくなってきた。 パラメータ少し変えたら2時間、学習データを追加するたびに2時間…。 耐えられなくなってきたので、GPU利用で速くしたいというのは自明な流れ。

ちょうどその時期に、自宅のPCの買い替えを検討していたので、人柱になってやろうという気になった。 買ったのは、ALIENWARE13のGTX1060(6GB)搭載のモデル。(本当は、Surface Laptopを買おうと思っていたけど、NDIVIAのGPU載ってないからやめた)

このPCに、Keras+TensorFlow(GPU)の環境を作ろうという話。

◆ 前提環境

◆ 準備

まずは、Keras+TensorFlow(GPU)にたどり着くためのツール類をインストールする。 バージョン超重要。すごくはまった。

  • CUDA ToolKit 8.0
  • cuDNN 5.1
  • Anaconda 4.4.0
  • Visual C++ 2015 Build Tool

* CUDA Toolkit

GPU使うために必要。 インストーラをポチポチやっていくだけなので、割愛。 最初のシステムチェックでワーニングでたけど、気にせず進めて問題なかった。

CUDA Toolkit Download | NVIDIA Developer

* CuDNN

TensorFlow-GPU使うために必要。 ユーザ登録必須。バージョンいろいろ出てくるけど「v5.1 for CUDA 8.0」を選択。 zipをダウンロード、解凍して、先程インストールしたCUDA Toolkitフォルダ配下に配置。

https://developer.nvidia.com/rdp/cudnn-download

* Anaconda

僕のPython力は高くないので、AnacondaでPytyon環境構築する。 これまた、インストーラをポチポチやっていくだけなので、割愛。

Download Anaconda Now! | Continuum

* Visual C++ 2015 Build Tool

TensorFlow-GPUをインストールするために必要。 またまた、インストーラをポチポチやっていくだけなので、割愛。時代に感謝。

Download the Visual C++ Build Tools (standalone C++ compiler, libraries and tools)

◆ Keras+TensorFlow(GPU)

* Anacondaの仮想環境

まずは、AnacondaでPython仮想環境を作る。Pythonのバージョンは、3.5。以下、この環境下で作業する。

c:> conda create -n Keras python=3.5
c:> activate Keras
(Keras) c:> 

* TensorFlow

公式の「Installing with Anaconda」に全部書いてあるとおり、pipコマンド一発。URLはここ。実はさっきの仮想環境作るところから書いてある。CUDAやcuDNN、Pythonのバージョンもここで指定されているので、きっちりその通りにしている。TensorFlowのバージョンは、1.2.1。

(Keras) c:> pip install --ignore-installed --upgrade https://storage.googleapis.com/tensorflow/windows/gpu/tensorflow_gpu-1.2.1-cp35-cp35m-win_amd64.whl

コマンド実行後、以下が実行できればインストールできている。

(Keras) c:> python
>>> import tensorflow as tf
>>> hello = tf.constant('Hello, TensorFlow!')
>>> sess = tf.Session()
>>> print(sess.run(hello))
Hello, TensorFlow!

* Keras

これもコマンド一発だが、途中「scipy」が正しくインストールされず、エラーでこけてしまった。 なので、condaコマンドで個別インストールしてから、再度インストールする。 Kerasのバージョンは、2.0.6。

(Keras) c:> conda install scipy
(Keras) c:> pip install keras

これで環境構築は終わり。

◆ 速度比較

環境が出来上がったので、さっそく速度比較をしてみる。MNISTを例にCPU利用、GPU利用で比較をした。実行したソースは以下(mnist.py)。

import keras
from keras.datasets import mnist
from keras.models   import Sequential
from keras.layers   import Dense, Dropout, Flatten
from keras.layers   import Conv2D, MaxPooling2D
from keras          import backend as K

batch_size  = 128
num_classes = 10
epochs = 1

img_rows, img_cols = 28, 28

(x_train, y_train), (x_test, y_test) = mnist.load_data()

if K.image_data_format() == 'channels_first':
    x_train = x_train.reshape(x_train.shape[0], 1, img_rows, img_cols)
    x_test  = x_test.reshape(x_test.shape[0], 1, img_rows, img_cols)
    input_shape = (1, img_rows, img_cols)
else:
    x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, 1)
    x_test  = x_test.reshape(x_test.shape[0], img_rows, img_cols, 1)
    input_shape = (img_rows, img_cols, 1)

x_train = x_train.astype('float32')
x_test  = x_test.astype('float32')
x_train /= 255
x_test  /= 255

y_train = keras.utils.to_categorical(y_train, num_classes)
y_test = keras.utils.to_categorical(y_test, num_classes)

model = Sequential()
model.add(Conv2D(32, kernel_size=(3,3), 
                 activation='relu', 
                 input_shape=input_shape))
model.add(Conv2D(64, kernel_size=(3,3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(num_classes, activation='softmax'))

model.compile(loss=keras.losses.categorical_crossentropy,
              optimizer=keras.optimizers.Adadelta(),
              metrics=['accuracy'])

model.fit(x_train, y_train,
          batch_size=batch_size,
          epochs=epochs,
          verbose=1,
          validation_data=(x_test, y_test))

score = model.evaluate(x_test, y_test, verbose=0)
print('Test loss:', score[0])
print('Test accuracy:', score[1])

実行方法

(Keras) c:> python mninst.py

結果

CPU利用時

215秒で終了。まあこんなもん。

Train on 60000 samples, validate on 10000 samples
Epoch 1/1
60000/60000 [==============================] - 215s - loss: 0.3186 - acc: 0.9039 - val_loss: 0.0743 - val_acc: 0.9770
Test loss: 0.0742522198511
Test accuracy: 0.977

GPU利用時

10秒で終了。速い。

Train on 60000 samples, validate on 10000 samples
Epoch 1/1
60000/60000 [==============================] - 10s - loss: 0.3392 - acc: 0.8977 - val_loss: 0.0827 - val_acc: 0.9746
Test loss: 0.082712899866
Test accuracy: 0.9746

◆ 感想

GPU速い。超速い。にわかニューラルネット開発だけど、速いは正義を実感。

◆ その他

CPU実行の環境は、実はDockerで作っていた。なので、はじめはGPU環境もDockerでできないかしらとか思ってた。 だけど、Linux上での構築方法しかできなさそうだったので、あきらめた。ガッデム。