数理的手法を使いやすくするためのソフトウェア開発

科学技術計算とデータサイエンスについて

機械学習エンジニア見習い

ディープラーニングを高速化したい、と言い続けていたら^1、関連部署に異動させてもらえました。それを前の上司から聞いた時には単純に喜んだのですが、今はいろいろと複雑です。仕事が進まないことに焦ったりもします。

いえ、仕事というより、その準備段階の動作テストで焦っていました。

単一ノードでGPUを使って学習させるところまでは簡単でした。ネットに情報があふれていますから、それをなぞるだけです。しかし、複数ノードではそうはいきませんでした。GPUクラスタでMPI並列を使ってディープラーニングしたというウェブ記事をなぞっても、動作しないのです。

そこで、ひたすら試行錯誤して、フレームワーク内部のコードを読んでいると、自分はまだまだ見習いだと感じます。本物の機械学習エンジニアが数カ月前に出した結果を、再現するのに一週間かかってしまいました。

機械学習エンジニアになるために学び始めた頃は^2GPUでの分散並列くらいすぐにできると思っていたのですが。。 ともあれ、基礎的なことからコツコツやっていきたいと思います。

参考

1^: 計算科学からデータ集約型科学へのワークシフト

2^: 機械学習エンジニアになるために学ぶべき5つのスキル(海外記事紹介)

研究者あるいはエンジニアの転職

研究者からデータサイエンティストへの華麗な転身^1 で有名なTJOさんが、自身の経験にもとづいて、 転職を考えているポスドクの人たちのために ブログ記事^2をまとめていました。

現役のポスドクだけでなく

その記事は、データサイエンス分野だけでなく、おそらく、 他の理工系分野のポスドクにも役立ちそうです。 そこには、転職前に検討すべきこと、転職の仕方、転職後のサバイバル法 がまとめられています。 おそらく、これから転職を考えているポスドクだけでなく、 すでに転職した元ポスドクにとっても興味深い内容です。 実際、私も元ポスドクで、10年以上前に民間企業へ転職して、 今もその企業で働いているのですが、 非常に感心しました。

なんといっても、長期的な戦略を立てて能動的に行動しているところが素晴らしい。 それに対して、私の転職は、お世話になっていた先生の紹介という受け身であり、 入社後も戦略的というよりも、流されてしまっていることが多いです。反省させられました。

社外あるいは社内での転職のために

しかし、世の中の流れを考えて、仕事の内容を主体的に選び、 そのためにスキルや知識を身につけたり、コネを作ることは、 社外へ転職するためだけではなく、社内で働き続けるためにも必要なのだと思います。 実際、去年から機械学習について学んだ結果として、 社外へ転職してはいないものの、 社内で異動してディープラーニングの高速化に従事することになりました。

こうしてみると、社外転職と社内転職を区別する理由はそれほどないのかもしれません。 そもそも、進歩が指数関数的に加速する世の中では、 科学・工学分野の同じ領域で仕事を続けることは難しくなっています。 なので、その変化に企業が適応しようとするときには、 昔のやりかたに固執する個人は職を失いかねません。 そうならずに働き続けるためには、 社内転職するくらいの準備が必要です。 他方では、その変化に個人が適応しようとしているときに、 昔のやりかたに固執する企業に未来はありません。 そんな企業と心中しないためには、社外転職するための準備が必要です。 そして、どちらの場合でも、個人として準備すべきことは、 将来の変化を見越して、次の仕事を選び、そのために学んでおくことなのだと思います。

時代の流れ

それにしても、自分が企業に就職したときと比べると、 研究者やエンジニアの雇用状況は良くも悪くもすっかり変わってしまいました。 悪いことというのは、アカデミアでの雇用が博士過程進学者が減少するほどに 厳しくなってしまったことです。かといって、民間企業はもはや終身雇用を保証できなくなっています。 しかし、良いことととして、科学・工学分野の進歩と、その産業界への波及の両方が速くなったお陰で、 新興分野でのスキルと学識を持っている人たちは好条件で職を得やすくなっています。 ですから、総合的には希望の持てる状況だと思います。

参考

^1:六本木で働くデータサイエンティストのブログ: 2012年春の転職活動について:研究者→民間企業

^2:六本木で働くデータサイエンティストのブログ: 企業に移って5年が経ちました

Docker で TensorFlow を Ubuntu 16.04 にインストール

職場では Anaconda で TensorFlow をインストール^1 したのですが、自宅では Docker でやってみました^2 ^3。やってみるまで、Anaconda, Docker の何が良くて、どのように使い分けるのか良く分かっていませんでした。なので実践から。

自宅PCはグラフィックボード AMD Radeon HD 7770 を積んでいて、SC15でRadeonでCUDAを使えるようにするよと発表^7 ^8があったと聞いているのですが、まずは、GPUなしでと、CPU版をインストールしました。

Dockerの入門的知識は必要

いきなり、Docker をインストールして、TensorFlowコンテナを実行してみると、いろいろとおかしなことが起きました。

やはり、最低限の知識として、Docker のイメージ・コンテナ管理の基本と、イメージのビルド方法くらいは必要です。今思うと、

Docker入門 – コンテナ型の仮想化技術の解説 ^4

の Quick Start -> Try it! と、

「さわって理解するDocker入門」オージス総研 大西 洋平 ^5

の第1回、第2回くらい、あるいは、

@IT > いまさら聞けないDocker入門 ^6

の第1-3回くらいを、読んでから取り掛かったほうが、早く出来たのかもしれません。

Docker をインストール

まず、必要なパッケージをインストールしました。

$ sudo apt-get update
$ sudo apt-get install -y --no-install-recommends \
    linux-image-extra-$(uname -r) \
    linux-image-extra-virtual
$ sudo apt-get -y --no-install-recommends install curl \
    apt-transport-https \
    ca-certificates \
    software-properties-common

次は、レポジトリをセットアップ。まずはDockerのオフィシャルGPG keyを追加しました。

$ curl -fsSL https://apt.dockerproject.org/gpg | sudo apt-key add -
OK

Key IDの検証。

$ apt-key fingerprint 58118E89F3A912897C070ADBF76221572C52609D
pub   4096R/2C52609D 2015-07-14
      フィンガー・プリント = 5811 8E89 F3A9 1289 7C07  0ADB F762 2157 2C52 609D
uid                  Docker Release Tool (releasedocker) <docker@docker.com>

安定版のレポジトリをセットアップ。

$ sudo add-apt-repository \
       "deb https://apt.dockerproject.org/repo/ \
       ubuntu-$(lsb_release -cs) \
       main"

これで、Dockerをインストールできるようになりました。あとは、

$ sudo apt-get -y install docker-engine

で docker-engine_17.04.0~ce-0~ubuntu-xenial_amd64.deb が入りました。

しかし、このままでは Docker を実行するためのスーパーユーザー権限が必要なので、、Ask ubuntu: problem with docker

After installing Docker you are prompted to add your user to the docker group. Simply run the command shown:

sudo usermod -aG docker $USER
You will need to close your session and log in again to have the change take effect.

にしたがって、sudo usermod -aG docker $USER を実行して、ログアウトして、ログインしました。すると、

$ docker version
Client:
 Version:      17.04.0-ce
 API version:  1.28
 Go version:   go1.7.5
 Git commit:   4845c56
 Built:        Mon Apr  3 18:07:42 2017
 OS/Arch:      linux/amd64

Server:
 Version:      17.04.0-ce
 API version:  1.28 (minimum version 1.12)
 Go version:   go1.7.5
 Git commit:   4845c56
 Built:        Mon Apr  3 18:07:42 2017
 OS/Arch:      linux/amd64
 Experimental: false

のように問題なく version コマンドを実行できました。

TensorFlowコンテナを生成・実行

CPU安定版のDocker イメージからコンテナを生成させて、実行しました。

$ docker run -it -p 8888:8888 tensorflow/tensorflow
Unable to find image 'tensorflow/tensorflow:latest' locally
latest: Pulling from tensorflow/tensorflow
   ;

    Copy/paste this URL into your browser when you connect for the first time,
    to login with a token:
        http://localhost:8888/?token=(毎回、生成されるトークン)

で、最後に表示された「http://localhost:8888/?token=(毎回、生成されるトークン)」にブラウザでアクセスしてみました。

すると、図1のようにJupyter notebook が使えるようになりました。

図1: Jupyter notebook の画面(「TensorFlowが動作するDockerの開発環境を構築する」 ^3からの引用)

ただ、1_hello_tensorflow.ipynb を開いてみると、

Notebook validation failed

An invalid notebook may not function properly. The validation error was:
Notebook validation failed: Additional properties are not allowed (u'metadata' was unexpected):
{
 "output_type": "stream", 
 "text": "result:  [ 3.  3.  3.  3.]\n", 
 "name": "stdout", 
 "metadata": {}
}

というダイアログボックスがポップアップしました。何なのだ?

ともあれ、File -> New Notebook (python 2) で、 サンプルスクリプト

import tensorflow as tf
hello = tf.constant('Hello, TensorFlow!')
sess = tf.Session()
print(sess.run(hello))
a = tf.constant(10)
b = tf.constant(32)
print(sess.run(a+b))

を実行すると、

Hello, TensorFlow!
42

と結果が返ってきました。

ファイル名を sample.ipynb として、 File -> Save and Checkpoint として、ブラウザのタブを閉じて、再び、sample.ipynb を開いてみました。

こんどは、妙なダイアログボックスはポップアップしませんでした。 他のファイル、2_getting_started.ipynb 、 3_mnist_from_scratch.ipynb でも妙なダイアログボックスはポップアップしませんでした。ただ、1_hello_tensorflow.ipynb を開いてみると、今度も妙なダイアログボックスが。

よくわかりませんが、1_hello_tensorflow.ipynb だけのことなので、次に進みます。

Docker コンテナの停止と再スタート

Dockerコンテナを実行したターミナルで、Ctrl+C で、プロセスを止めました。

ps -a コマンドで、コンテナIDを調べて、startコマンドで再スタートさせました。(再スタートのコマンド名は start 、まぎらわしい。。)

$ docker ps -a
CONTAINER ID        IMAGE                   COMMAND                  CREATED             STATUS                     PORTS               NAMES
6a5ed12e18e1        tensorflow/tensorflow   "/run_jupyter.sh -..."   12 minutes ago      Exited (0) 5 minutes ago                       hardcore_goldwasser
$ docker start -i 6a5ed12e18e1

    Copy/paste this URL into your browser when you connect for the first time,
    to login with a token:
        http://localhost:8888/?token=(毎回、生成されるトークン)

http://localhost:8888/?token=(毎回、生成されるトークン)」にアクセスしてみると、 sample.py が前に保存にしたとおりの内容で残っていました。

Dockerイメージ作成

このコンテナを再びCtrl+Cで止めて、新しいDocker イメージをtfplussampleという名前で作ってみました。

$ docker commit 6a5ed12e18e1 tfplussample
sha256:07bddf474593056dee6a4162e67b89fde1015841327af8ff8dee565bb8d21fac
$ docker images
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
tfplussample            latest              07bddf474593        10 seconds ago      1.13GB
tensorflow/tensorflow   latest              04f0b1131389        12 days ago         1.13GB

このDocker イメージからコンテナが生成され、実行できることは、

$ docker run -it -p 8888:8888 tfplussample

で確認しました。ここで、前に作った sample.ipynb を sample.py としてホストマシンにダウンロードしました。

Docker イメージをビルド

次のようなDockerfile

FROM tfplussample
COPY ./sample.py /tmp/sample.py

を作成して、 Dockerイメージをビルドしてみました。一行目は、新イメージのベースとなるコンテナ名、二行は、ホストマシンから新イメージのコンテナへのファイルコピーを指定しています。

-tオプションで、イメージ名 tfplussample2 タグ名 tag1 としました。

$ docker build -t tfplussample2:tag1  .Sending build context to Docker daemon  4.096kB
Step 1/2 : FROM tfplussample
 ---> 07bddf474593
Step 2/2 : COPY ./sample.py /tmp/sample.py
 ---> 9de94c7d2502
Removing intermediate container 21067f8210cb
Successfully built 9de94c7d2502

Docker イメージを実行してみると、

$ docker run --rm -it tfplussample2:tag1 python /tmp/sample.py
Hello, TensorFlow!
42

のように、コンテナ内の/tmp/sample.py が実行されました。

まとめ

たしかに、インストールは簡単でした。TensorFlowに関係するファイルがDockerコンテナのなかにまとめられて、ホストマシンのほかのアプリから切り離されているようです。こうなると、他の機械学習関係のアプリやツールを別のコンテナに隔離することで、ライブラリバージョンの衝突などを回避できます。Pythonのバージョンの違いに悩まなくとも良くなるので、これは便利です。

それと、他人の作ったDockerイメージから、コンテナを簡単に自分のマシンに生成できるので、素早くアプリやツールに特化した実行環境を作れるようになります。これも便利です。一方で、Anaconda でも異なるpythonのバージョンを、別の環境に隔離できるのですが、環境を作るのは手作業なので時間がかかります。

ただ、Dockerの使い方を学ぶのに時間がかかりました。私の場合、半日。


参考

^1:Installing TensorFlow on Ubuntu : Installing with Anaconda

^2:Installing TensorFlow on Ubuntu : Installing with Docker

^3:TensorFlowが動作するDockerの開発環境を構築する

^4:Docker入門 – コンテナ型の仮想化技術の解説

^5:「さわって理解するDocker入門」オージス総研 大西 洋平

^6:@IT > いまさら聞けないDocker入門

^7:AMD Launches ‘Boltzmann Initiative’ to Dramatically Reduce Barriers to GPU Computing on AMD FirePro™ Graphics

^8:CUDAをRadeonで動かす(導入編)

メモ:Ubuntu 16.04 を 休止(ハイバネート)させるために (追記:休止できなくなることも)

Ubuntu 16.04 をインストールしただけでは、休止機能を使えませんでした。しかし、作業の途中で電源を落とすために必要なので、なんとか有効にしました。その方法をメモしておきます。

サスペンドできるようにした

インストール直後は、

$ sudo pm-hibernate

としても何も起こりませんでした。 また、もうひとつのコマンドでは、

$ sudo systemctl hibernate
Failed to hibernate system via logind: Sleep verb not supported

とエラーが出ました。

そこで、Ask ubuntu: How can I hibernate on Ubuntu 16.04? ^1

Secure Boot … It turns out that secure boot was the culprit: installing 16.04 you are asked what you want to do with it (which is a new thing as far as I can recall) and I kept it ON without giving it much thought.

After reboot and disabling secure boot in the BIOS settings (these are machine-specific, but usually pretty straightforward) … And indeed calling systemctl hibernate results in a successful hibernate/thaw sequence.

Moreover, after that I could see hibernation available as an option in various places of the graphical interface, without the need of any polkit hack. So it seems that systemd was actually guessing from /sys/power/disk that the system was not able to hibernate.

にしたがって、BIOSメニューから「安全なブートの構成」を見つけて、

安全なブート : 無効

にしました。すると、たしかに、ファイル/sys/power/disk は、

[disabled]

から、

[platform] shutdown reboot suspend

へと書き換えられました。しかし、私の場合、メニューに現れたのは、「ハイバーネート」ではなく、「サスペンド」でした。

そして、メニューのサスペンドを選ぶと、スクリーンはブラックアウトして、電源LEDの色が変わって、サスペンドしました。

そして、

$ sudo pm-hibernate

で、スクリーンはブラックアウトしましたが、電源はオンのままでした。それで、仕方なく、電源ボタン長押しで、強制的に電源を切らざるをえませんでした。

メニューに「ハイバネート」、しかし、電源はオンのまま

Ask ubuntu: Ubuntu 16.04 doesn’t hibernate ^2

You can also enable the hibernate option in the user menus. To do that, use your favorite text editor to create /etc/polkit-1/localauthority/50-local.d/com.ubuntu.enable-hibernate.pkla. Add the following to the file and save:

[Re-enable hibernate by default in upower]
Identity=unix-user:*
Action=org.freedesktop.upower.hibernate
ResultActive=yes

[Re-enable hibernate by default in logind]
Identity=unix-user:*
Action=org.freedesktop.login1.hibernate;org.freedesktop.login1.handle-hibernate-key;org.freedesktop.login1;org.freedesktop.login1.hibernate-multiple-sessions;org.freedesktop.login1.hibernate-ignore-inhibit
ResultActive=yes

そのとおりにやってみると、たしかに、メニューに「ハイバーネート」が現れました。しかし、クリックしても、休止せず、電源はオンのままでした。

休止できるようになった

次は、

Ask ubuntu: Ubuntu 16.04 doesn’t hibernate ^2

Since you’re running Ubuntu 16.04, you should consider running the native systemd suspend/hibernate services in lieu of the pm-utils tools.

In my own case, here’s what I’ve done to configure my machine for hibernate/resume using systemd:

にそって、まず、スワップ領域のUUID を、

tail -n -9 /proc/swaps | cut -d ' ' -f 1 | xargs sudo blkid

のように調べました^3

1) /etc/default/grub の GRUB_CMDLINE_LINUX_DEFAULT の行を、

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash pci=nomsi  resume=UUID=(上記で調べたUUID)"

のように書き換えました。

2) sudo update-grub

3) /etc/initramfs-tools/conf.d/resume に UUIDが正しく書き込まれていることを確認しました。

4) sudo update-initramfs -u

5) sudo service systemd-logind restart

6) 再起動。

これで、メニューの「ハイバーネート」で、電源がオフになり、電源をオンにすると、Ubuntu の認証画面が現れ、ログインすると、作業途中のデスクトップに戻れました。

これで、私自身もハイバーネートします。おやすみなさい。

追記

2017/05/05

使っているうちに、休止できなくなることが判明しました。休止できるのは、上記ステップ 2) , 4), 5) を繰り返して、再起動して、しばらくの間だけでした。それ以外のときは、メニューの「ハイバーネート」を選んでも、あるいは、 sudo pm-hibernate としても、画面表示は消えるものの、電源はオフにならず、オンのままでした。

また、sudo pm-hibernate を実行する前に、上記ステップ 2) , 4), 5) をしてみたのですが、それでも、画面表示は消えるものの、電源はオンのままでした。


参考

^1:Ask ubuntu: How can I hibernate on Ubuntu 16.04?

^2:Ask ubuntu: Ubuntu 16.04 doesn’t hibernate

^3:Ask ubuntu: Why isn’t Hibernate in Ubuntu 16.04 working and how to fix it?

Ubuntu 16.04 のインストールディスクは ネットワークアダプター Atheros AR8161 Gigabit Ethernet への対応が不完全だった

先代のメインPC^1機械学習の練習マシンとすべく、日本語版Ubuntu 16.04 をインストールしました。しかし、どういうわけかネットワーク接続が不安定で、数秒間つながって、切れて、また、つながって切れて、を繰り返していました。

しかも、「インストール中にアップデート」を選んだのに、まったくアップデートされていませんでした。

解決策

まず、件のPCでLANアダプタは

$ lspci | egrep '(Ethernet|Network)'
03:00.0 Ethernet controller: Qualcomm Atheros AR8161 Gigabit Ethernet (rev 08)

ということで、ググッてみました。

すると、[ubuntu] Ethernat / Wired connection not working^2

First, open Network Manager and set the MTU for the wired connection to 8192. Reboot and see if it works correctly

というアドバイスが。

再インストールと結果

そこで、Ubuntuインストールディスク起動後に、"Try ubuntu"を選んで、

$ sudo ifconfig eno1 mtu 8192

としてみると^3、安定してネットにつながるように。感動。 あとは、"Install Ubuntu"アイコンをクリック、今度はネットワークにつながるからなのか、前よりも早くインストールできました。

ただ、不思議なのは、そうしてインストールしたUbuntu 16.04 では、mtuの値を大きくしなくとも、安定してネットワークにつながっていることです。

$ sudo ip addr
   ;
2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
   ;

ネットワーク接続 -> 有線接続1 -> Ethernet で見ても、

MTU 自動

となっています。

なぜなのか。。

まあ、これでネットから機械学習関連ツールをインストールできるようなったので、よしとします。まずは、TensorFlowのMNISTチュートリアルを理解するところからはじめます^4


参考

^1:「メモ:VMwareとVirtualBoxの仮想マシンを引っ越し」で書いたように、年末にブルースクリーンを頻発していた先代のメインPCが、最近はいたって好調なのです。

^2:[ubuntu] Ethernat / Wired connection not working

^3:Ubuntu 12.04:MTU値を変更しNetworkを最適化する

^4:「TensorFlowで学ぶディープラーニング入門 ~畳み込みニューラルネットワーク徹底解説」中井 悦司 2016/9/27

計算科学からデータ集約型科学へのワークシフト

この半年、機械学習エンジニアとして仕事をしたいと思ったり ^1 ^2 、 データ分析の仕事のほうがまだ適性があるのではと言われて、 そこを目指そうと思ったりしてきました。

ただ、キャリアを変えるのはなかなか難しいです。 社内公募がないと聞いて落胆したり、 自分にはまだデータサイエンス分野で 仕事を得るためにアピールできるものがないと思い知らされたり。

しかし、チャンスもあるようです。 高性能計算(HPC)の分野では、 昔は、計算科学のためのシステムが大きな割合を占めていましたが、 今では、機械学習ディープラーニングのためのシステムが増えてきているからです。 しかも、計算科学のなかでも機械学習の手法が使われることが増えてきています。

そんなわけで、計算科学分野からデータ集約型科学分野へ ^3 ^4 華麗にキャリアチェンジというわけにはいきませんでしたが、 地味にワークシフト ^5 していきたいと思います。


参考

^1:機械学習エンジニアになるために学ぶべき5つのスキル(海外記事紹介)

^2:Coursera機械学習コースは、仕事を得るための準備としてどれほどのものか?

^3:“The Fourth Paradigm: Data-Intensive Scientific Discovery – Book Released”, eSciece@Microsoft .

^4:計算科学からデータ集約型科学へのシフトで、数理的手法が使いやすくなっている

^5:「ワーク・シフト ― 孤独と貧困から自由になる働き方の未来図」リンダ・グラットン (著), 池村 千秋 (翻訳)

テクノロジーを民主化するには、ソフトウェア開発の民主化から

グーグルなどの言う「機械学習民主化^1 ^2 が文字通りの意味ならば、彼らが目指しているのは、 多数の機械学習エンジニアが、多数の人々の利益のために、 という理想だと思います。 これに対して、現実では、 少数のエンジニアリングを理解しない人々が、少数の人々の利益のために、 ということが起こりがちです。 この理想と現実のギャップを解消することは可能なのでしょうか?

テクノロジー民主化するために

民主化といえば、 リンカーンのゲティスバーク演説 ^3

「人民による、人民のための、人民の統治」

のフレーズが有名です。これにならえば、テクノロジー民主化とは、

「エンジニアによる、エンジニアのための、エンジニアリング」

ではないでしょうか。

リンカーンのフレーズは、フランス革命アメリカ建国によってどのような問題が解決されたかを示しています。問題とは、統治のありかたが、貴族や専制君主によって、人民には不利益が生じるようなかたちで、決定されていたことです。 同様に、テクノロジー民主化が解決するであろう問題とは、 エンジニアリングのありかたが、 エンジニアリングを理解しない人々によって、 エンジニアリングから不利益が生じるようなかたちで、決定されていることです。

ソフトウェア・エンジニアリングを理解しない人々によるエンジニアリング

例えば、日本の家電メーカーには次のような問題があります。

日本経済新聞「日の丸家電、打倒アップルの条件 ソフト重視へ転換せよ」中島聡^14

魅力的なソフトウエアを作り出すための全体仕様(アーキテクチャー)を設計することは、机上だけでは決して不可能だ。シェフが実際の料理を作りながらレシピを作るのと同様に、設計を担当するエンジニア自らがプログラムを書き「作っては壊し」の過程を経てはじめてよいアーキテクチャーを作ることができる。

アップル・アマゾン・グーグルをはじめソフトで勝負をしている企業は、どこもそうした開発体制をとっている。...

一方、日本のメーカーでは自分自身がプログラムを書いたこともない幹部候補生が頭の中だけでソフトを設計し、プログラミング作業は子会社に丸投げしている。...

ここで問題なのは、プログラミングを理解しない人が、 ソフトウェアの設計をして、プログラミングのありかたを決めていることです。 こうして、生み出されるソフトウェアに競争力がないために ^4 、利益率が低くなり、エンジニアの待遇は悪くなっています ^5

そして似たような問題は、伝統的な計算科学分野にもあります。

この分野では、ソフトウェア開発のありかたを決めている人々は ハードウェアについては十分に理解していますが、ソフトウェア開発についての理解はそれほどではありません。 そのために、新しい分野で Fortranのような時代遅れの言語は使われなくなり、 言語も開発手法も新しくなっているのとは対象的に、 伝統的分野では、 未だにFortranで書かれた「秘伝のタレ」を、 フォートラン時代の手法で守っています。 その結果、前時代的な日本発の計算科学アプリケーションは 近代的スタイルで開発された 海外発のアプリケーションとの競争に敗れ、 今や、日本国内ですら、海外発の計算科学シミュレーションが 多く使われています。

ソフトウェア・エンジニアリングを理解する人々によるエンジニアリング

日本に比べて、 アメリカのソフトウェアが高い競争力を持っているのは、 ソフトウェア開発者を理解している人々がソフトウェア開発のありかたを決めているからです ^4

そこには、プログラミングを理解しない人が、 プログラミングのありかたを決めてしまうという愚行はありません。 また、フォートラン時代のプログラミングしか知らない人が、 古い開発言語や手法を若い人々に強要するという蛮行もないのです。

このようなソフトウェア開発の民主化によって、 機械学習民主化も実現されつつあります。

具体的に言うと、 昔は、機械学習のアプリケーションプログラムを書くときに、 CやC++でゴリゴリと書いていたのが、 まず、C++Pythonで包み込んだライブラリやソフトウェアフレームワークが普及して、 scikit-learn ^6 などで python スクリプトによって楽にアプリを開発できるようになりました。 そのうちに、TensorFlow ^7 , Chainer ^8 のようにニューラルネットワーク記述のための 領域特化言語が埋め込まれたフレームワークが出てきて、更に楽になりました。 そして、今では、クラウド機械学習 ^9 ^10 ^11 が提供されて、 アプリ開発はプラモデル並みの気楽さになりつつあります ^12 ^13

これに対して、日本の計算科学分野では、ソフトウェア開発が民主化されていないので、 FortranやCでゴリゴリと書くしかなく、 そのような前近代的なプログラミングスタイルには、 オブジェクト指向フレームワークや領域特化言語を使うことによる 素早さや楽しさはありません。

このように、ソフトウェア開発のありかたが、 フォートラン時代なのか近代的なのかによって、 生み出されるソフトウェアやテクノロジーの競争力はまるで違ってきます。

数理的手法を民主化する鍵は、ソフトウェア開発の民主化

以上のように見ていくと、アメリカで機械学習や科学シミュレーションといった数理的手法 が民主化されつつあるのは、ソフトウェア開発が民主化されていたからだと思います。 近代的なソフトウェア開発手法や、 ソフトウェア部品を利用するというプログラミングスタイルが広まっていたからこそ、 大勢の人々がテクノロジーのアプリケーション開発に参加することができ、 その利益が大勢の人々に分配されるのです。

対照的に、日本では、数理的手法に基づくテクノロジー分野において、 ソフトウェア開発が民主化されていないために、 ソフトウェアの生産性と競争力は低く、 その利益率も低いままです。

このように、経済的な利益からいえば、民主化したほうが良いのに、 日本のソフトウェア開発が民主化されないのは、なぜなのでしょうか?

私はそれは、前近代的な手法であっても、日本経済がそこそこ回っていて、 エンジニアの不満は高まってきてはいても、 爆発するレベルには到達していないからだと思います。 私も、米国企業が知識集約型のビジネスモデルで 高い利益率を達成しているを知り、 日本企業が労働集約型のビジネスモデル ^4 で低い利益率に甘んじているのを苦々しく思いながらも、 勤務先を変えてはいません。

しかし、国や企業が破綻する兆候が見えてくると、 そうも言ってられません。


参考

^1:Quara "Why is it important to democratize machine learning?"

^2:なぜ、機械学習の民主化は重要か?

^3:ゲティスバーク演説 - wiki

^4:gihyo.jp » Software is Beautiful » 第3回 なぜ日本のソフトウェアが世界で通用しないのか

^5:ITエンジニアの地位とは?国別、職種別の年収比較

^6:scikit-learn

^7:TensorFlow

^8:Chainer

^9:Amazon Machine Learning

^10:Machine Learning - Microsoft Azure

^11:Google Cloud Machine Learning at Scale | Google Cloud Platform

^12:Gigazine「Googleが自社で使っている「クラウド機械学習」を一般に開放、こんなスゴイことが簡単にできる」

^13:Cloud Vision APIの凄さを伝えるべくRasPi botとビデオを作った話

^14:日本経済新聞2014/01/15「日の丸家電、打倒アップルの条件 ソフト重視へ転換せよ」中島聡