あさのひとりごと

3日坊主にならないように、全力を尽くします。 記事は個人のひとりごとです。所属する組織の意見を代表するほど、仕事熱心じゃないです。

2017年にがんばったことと2018年のやっていき💪

仕事も大掃除も終わってないですが、2017年が終わろうとしています。

2017年、良い1年でした!

2017年のアウトプット

8月/9月の2か月はブラブラしていたので、実質10か月でのアウトプットです。

  • 商用誌2冊
  • 同人誌2冊
  • Software Design寄稿1回
  • Web連載4回
  • イベント登壇3回
  • 学会発表1回

毎月なにか書く、2か月毎になにか発表ぐらいのペースでした。

2017年新しくチャレンジしたこと

2016年はDockerコンテナだけだったのですが、上方向と横方向にちょびっと触手をのばしました。

  • 大学1年生の数学やりなおし
  • AWS/Azure/GCPの各MLマネージドの使い方マスター
  • AWS Batch/Azure Batchの使い方マスター
  • OpenFOAM/Dockerで簡単な非粘性流体の解析
  • TensorFlow/Kerasで画像認識の実装

特に1年間地味に解析学線形代数のごく簡単なのを勉強して、OpenFOAMでカタコトの実装ができるようになったのは、わたしのなかではとても大きいデス。計算力学技術者の資格もとりました! チュートリアルをもとに非粘性流体の解析をし、ParaViewも使い方を何となくマスターし、CFD関連の論文も少しだけ読みました。来年はきちんとどこかでシミュレーションの発表できるようにしたいなと。

f:id:dr_asa:20171229192141p:plain

機械学習の基本も勉強しました。書籍を読んだりオンラインセミナーを受講したりでサンプルやチュートリアルなどをやりました。TensorFlow/Kerasでごく基本的な画像推論や転移学習などができるように。たぶんCNNは何となく理解です。

データ集めて前処理して学習モデルを作るだけじゃなく、学習基盤と推論アプリをデプロイしてサービス提供もきちんとやりました。オンプレPCクラスタクラウドVMで学習し、KubernetesクラスタでWebアプリとして公開したり、推論APIAndroidからコールするなども。

あと、AndoridThings/RaspberryPiなどデバイス側でTensorFlowを動かし推論するなどもやりました。TensorFlowLiteは今後もひそかに注目したいです。

で、案の定、、、「機械学習や数値解析のジョブのワークロードをどうするか」「分散学習のための基盤つくる」などのほうが個人的にはお楽しみポイントが多く、CloudML、KubeFlowやAmazon SageMaker、Azure Batch、AWS Batch方面は楽しく勉強できました。

2018年のやっていき💪

現時点の予定ですが、、、プラットフォームに関する書籍を新たに書かせていただく予定です。あと今年ちまちま書いた本が4月に刊行になります。

2017年は同人誌を書いたのがとても楽しかったです。自分が好きなものを好きなようにつくる、という行為そのものが好きなので、手芸とか工作とかそういう感じで。2018年もプライベートで没入できるなにかができればいいなと。

そして、、、、

あまり体が丈夫でないというのもあり、2018年はいつくたばっても後悔のないように「やりたい!」とおもったことはすぐやろうと思ってます。迷わず、すぐに。

やっていきやっていき💪

おわり

GoogleのJupyterNotebookオンライン共有サービス(Colaboratory)を使って流体解析の勉強をしてみた感想

この記事は Colaboratory Advent Calendar 2017 23日目の記事です

Colaboratoryとは、Jupyter Notebookをオンラインで共有できるサービスです。 Googleが提供しています。

こちらからアクセスすると利用可能です。

Colaboratory – Google

作成したNotebookは、Googleドライブに保存されます。Googleドキュメントのように、複数人でコメントを書き入れたり、共同で編集できたりします。編集権限も設定可能なようです。

こんな作業イメージです。コードレビューやオンラインのプログラミング教育サービスなどに使えそうな気もします。

f:id:dr_asa:20171222085743p:plain

Pyhonは学習コストも低く、かつNumpyやScipyのような行列計算や数値計算関連のライブラリも豊富で可視化ツールもあるので、科学技術計算で利用する人も多いようです。

というわけで、数値流体解析の基礎を勉強するためのチュートリアルをやってみました。

github.com

こんな感じですね。JupyterNotebookと同じようにLaTeXで数式やMarkdownでメモが残せるので、勉強ノートとしては良いと思いました。

f:id:dr_asa:20171222092024p:plain

左側のカラム(?)でセクションを管理出来るので、ごちゃごちゃになりがちなコードもまとめて管理できます。この例だと、「熱伝導方程式」「2次元」など適当なセクションですが、、、書籍や研修教材のサンプルコード共有にいいかもしれません。

f:id:dr_asa:20171222092601p:plain

Googleのツールなだけあって深層学習にはもってこいのツールだなとました。カーネルPython2.7であるというのが地味なつらみですが、GCP前提だとぜんぜん問題ないと思います。

そもそも流体解析をちゃんとやるなら、PythonではなくC++Fortranのほうがよさげ!とおもうので、、、深層学習以外の用途では、AWS Cloud9やVisual Studio Live Shareをつかうのが良いのかなと。どちらもこれからですが、とても期待しています。

おわり

【書評】Microsoft Azure実践ガイドを読みました

インプレス社からMicrosoft Azureの本格的な実践ガイドが出ました。

book.impress.co.jp

大変勉強になり、多くの炭素生命体におすすめしたいので書評をまとめました。

前提読者

この本の前提読者は 「企業」や「組織」でシステム開発・運用に従事し、Azureを活用したいアプリケーション開発者/インフラ技術者を対象にしています。

システム開発やインフラ構築の基礎的なところを理解しているエンジニア向けの本です。 大規模オンプレやAWSなどですでにBtoBの「業務」システムを開発・構築したことがある人向けでです。

あと、.NET アプリケーションだけではないです。 オープンなテクノロジーのアプリケーションをAzureで動かしたい人で、Azureの中身をしっかり理解したい人もぜひ。

導入

第1章でAzureの概要とAzureを利用するまでの流れが説明されています。 第2章ではサンプルシステムの構築と、コスト試算のしかたなど非常に実用的な内容がわかりやすくまとまっています。

サンプルの構成は、Azure Load Balancerの後ろに冗長化されたVMの後ろでSQL Databaseを構成するシンプルな構成です。

Compute

第3章は仮想マシンについての詳細な説明があります。スペック選定や起動/停止/削除、スケールのしかた、監視やログの確認などがコンパクトにまとまっています。

第4章はPaaSであるAzure App Serviceの解説があります。Azure App Serviceは複数ありますが、ここではWebAppについて書かれてあります。

私的には、Azureの推しはやはりPaaSかなと。

Visual Studioに慣れているというのもありますが、公式ドキュメントが非常にしっかりしており、豊富なサンプルコードもあり、わたしのような実装力低いマンが具体的になにかアプリを作りたい!となったときに一番早くサービス提供できるのが、Azureかなとおもっています。

本書には解説はありませんが、私がWeb App for Containerをはじめて使った時の感想は 「もう、ぜんぶこれでいいじゃんかよ」 以外出てきませんでした。

ぜひ騙されたと思って、使ってみてください。 あとは、Kuduの詳しい説明があるのも嬉しいところです。

Networking & Security

第5章では仮想ネットワーク(VNet)に関する説明、第6章ネットワークセキュリティでNSGによるアクセス制御がまとめられています。 また第7章ではプライベートネットワーク接続で、サイト間VPN接続の話やExpressRouteなどの詳細な説明があります。

サイト間VPNや強制トンネリング、ExpressRouteのバックアップのためのサイト間VPN専用線のハイブリット構成などなど様々なパターンが整理されています。

いずれも業務システムを運用する上では、必須なところが非常に分かりやすく書かれています。 書き口もCiscoっぽい感じでまとまってて、、、なるほどなるほど、でした。

第8章は、ID管理全般、Azure ADとRBACの説明、リソースポリシーの考え方がまとまっています。

私は過去に業務システムの統合認証基盤PJにすこし関わっていたこともあり、大規模システムのID管理の厄介さを肌身で知っていますが、AWSにしろAzureにしろこのID管理とアクセス制御のアーキテクチャがきちんと理解できてないとクラウドは利用できないので、ぜひ。

おかげさまで、ゆるふわっとしか理解していなかった知識がだいぶすっきり整理されました。

Storage & Datastore

第9章は、Azure Storageの概要とストレージアカウントの作成方法につつき、オブジェクトストレージであるBlob/NoSQLであるTableストレージ/メッセージング用のQueueストレージなどの解説されています。いずれもわかりやすい図が付いているので、苦手でも問題なく読めます。

あと、業務システムではセキュリティに関していろいろうるさく言われると思いますが、SSE/クライアント側での暗号化/Azure Disk Encryptionによる暗号化方式の違いがまとまっています。

ストレージへのアクセス制御や監視など、おきまりのツボもきちんとおさえています。

第10章では、Managed Diskの解説があり、可用性セットとの関係性や、スナップショットの取り方などがまとまっています。

第11章では、SQL Databaseについての詳細な解説があります。Lift and Shift案件では、DB周りの知識は必須になりますが、かなりのページ数を割いて丁寧に解説されています。アクティブgeoレプリケーションなども解説があり、どのパターンでどういう可用性構成を設計すればよいかのノウハウも記述されています。

第12章では、PostgreSQLSQL Data WarehouseやAzure CosmosDBやAzure Data Lake Storeなどのデータストアに関する説明があります。ここは詳細なオペレーションではなく、どういうときにどのストレージを使うべきかみたいな方法論がまとまっています。

私はストレージやデータベース周りの設計運用経験がほとんどなく、とても苦手なので、ここは繰り返しなんども読みたいと思います。

Infrastructure as Code

Azureの良いところは、ツールがとにかく使いやすい、(ごく普通の)開発者フレンドリーなことです。

クラウドの概要を理解し、GUIでのオペレーションに慣れてくるとだんだんうざくなり、多くの炭素生命体はコードベース・定義ベースでシステムを管理したくなるものです。

この章をきちんと読めば、Visual Studoを使ってARMテンプレートを作成=>デプロイが可能です。

リファレンスアーキテクチャと構築テクニック

ここは、必見です。大事なことなので2度繰り返しますが、ここは必見です。

クラウドエンタープライズな業務システムに適用させる場合、現状の業務をきちんと分析・整理し、いかにクラウドネイティブなアーキテクチャにもっていくかが成功の分かれ目な気がします。その際、たくさんのサービスを組み合わせて、最適なアーキテクチャを設計するのは、非常に高いスキルを求められます。

そういうハイスキルエンジニアを雇える企業はそう多くないので、リファレンスアーキテクチャや導入事例などを真似しながら、クラウド移行していくのが成功への近道なので、こってりした脂っこいアーキテクチャはなるべくたくさん知りたいわけです。

本書では、ASP.NET+SQL DatabaseおよびNode.js+CosmosDBを

  • IaaSでシングルリージョンで構成するパターン
  • PaaSでシングルリージョンで構成するパターン
  • PaaSでマルチリージョンで構成するパターン

でそれぞれ設計と実装を図解されています。その際

  • 可用性
  • 拡張性
  • セキュリティ
  • 運用

といういたって王道な切り口で、テンプレートをどう構成すべきかなどが整理されています。 この章だけを切り出し500Pぐらいの別書籍化をおねがいします。


余談ですが、私が以前在籍していた会社の上司が執筆した書籍で、ことあるごとに参考にしています。いつかわたしもこういう本が書けるようになりたいなぁと。

クラウドデザインパターン設計ガイド-改訂版

いやいやいやいや、本が書きたいわけじゃなくて。実際にお客様に導入がしたいわけで😊

まとめ

とても良い本でした。

私の職場で調査研究・サービス提供しているシステムは、AWSまたはAzureで動いています。技術的についていけてないところばかりなんですが、、、、

2018年は、いろいろまじめにやっていきの年になるはず💪なので、よいバイブルです!

あと、1箇所誤字があったみたいなのでお知らせしておきます。

×:サブネット ○:寒ネット

f:id:dr_asa:20171219174422j:plain

おわり

自宅PCクラスタのKubernetesを1.9にバージョンアップしたログ

我が家の自宅PCクラスタ自宅並列計算機のOSがUbuntu16.04だったので、更新しました。

そのログです。

Kubernetesクラスタの構築にはkubeadmを使いました。kubeadmはkubernetes をデプロイするためのツールですが、現状まだベータリリースです。 Masterノードで動かすetcdなどを設定をDocker Swarmのような簡単さでやってくれます。

環境

次の環境でKubernetesクラスタを構築します。

  • Ubuntu 17.10
  • Kubernetes 1.9.0
  • Docker 17.09

アプリはすべてDockerで動かすという方針ですが 動作確認は

  • OpenFOAM on Docker

でおこないました。

Kubernetesクラスタ構築

OSインストール

まず、Ubuntuを17.10(Artful Aardvark)にします。

# cat /etc/os-release
NAME="Ubuntu"
VERSION="17.10 (Artful Aardvark)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 17.10"
VERSION_ID="17.10"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=artful
UBUNTU_CODENAME=artful

Dockerのインストール

次のコマンドを実行してDockerをインストールします。

# apt-get update
# apt-get install apt-transport-https ca-certificates curl software-properties-common
# curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
#  apt-key fingerprint 0EBFCD88

# add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu artful stable"

# apt-get update
# apt-get install docker-ce

確認します。

# docker info
~中略~
Server Version: 17.09.1-ce
Storage Driver: overlay2
 Backing Filesystem: extfs
 
~中略~
Operating System: Ubuntu 17.10
OSType: linux
Architecture: x86_64

DockerCE 17.09がインストールできます。

Kubernetesのインストール

次のコマンドを実行してKubernetesをインストールします。

# apt-get update && apt-get install -y apt-transport-https
# curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
# cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb http://apt.kubernetes.io/ kubernetes-xenial main
EOF

# apt-get update
# apt-get install -y kubelet kubeadm kubectl

これで、Kubernetes1.9.0がインストールできます。

Kubernetesの設定

以下で議論されているように、kubernetes1.8.0以降ではkubeadmで環境を構成するときエラーとなります。 github.com

そこで、/etc/systemd/system/kubelet.service.d/90-local-extras.confに以下を設定します。 kubeletの起動オプションでfail-swap-onフラグをfalseにします。 あと、kubeletのcgroupドライバをDockerにあわせてsystemdにしておきます。

Environment="KUBELET_EXTRA_ARGS=--fail-swap-on=false"
Environment="KUBELET_CGROUP_ARGS=--cgroup-driver=systemd"

なぜ、これをやるかというとKubernetes1.8.0でノードのSwapが有効な場合、kubelet が起動しないよう変更になったためです。swap を有効にして起動するときは、--fail-swap-on=false フラグを付加する必要があります。

こちらで話題になっています。 github.com

ここまでの手順を、MasterノードおよびWorkerノードで行います。

kubeadmでクラスタ作成

次のコマンドを実行して、MasterノードでKubernetesクラスタを作成します。 仮想ネットワークはFlannelをつかいます。

ログを確認すると、kubeadmが中でなにをやっているかがわかるとおもいます。

# sudo kubeadm init --pod-network-cidr=10.244.0.0/16
[init] Using Kubernetes version: v1.9.0
[init] Using Authorization modes: [Node RBAC]
[preflight] Running pre-flight checks.
        [WARNING SystemVerification]: docker version is greater than the most recently validated version. Docker version: 17.09.1-ce. Max validated version: 17.03
        [WARNING FileExisting-crictl]: crictl not found in system path
[preflight] Starting the kubelet service
[certificates] Generated ca certificate and key.
[certificates] Generated apiserver certificate and key.
[certificates] apiserver serving cert is signed for DNS names [pcmaster kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local] and IPs [10.96.0.1 192.168.1.100]
[certificates] Generated apiserver-kubelet-client certificate and key.
[certificates] Generated sa key and public key.
[certificates] Generated front-proxy-ca certificate and key.
[certificates] Generated front-proxy-client certificate and key.
[certificates] Valid certificates and keys now exist in "/etc/kubernetes/pki"
[kubeconfig] Wrote KubeConfig file to disk: "admin.conf"
[kubeconfig] Wrote KubeConfig file to disk: "kubelet.conf"
[kubeconfig] Wrote KubeConfig file to disk: "controller-manager.conf"
[kubeconfig] Wrote KubeConfig file to disk: "scheduler.conf"
[controlplane] Wrote Static Pod manifest for component kube-apiserver to "/etc/kubernetes/manifests/kube-apiserver.yaml"
[controlplane] Wrote Static Pod manifest for component kube-controller-manager to "/etc/kubernetes/manifests/kube-controller-manager.yaml"
[controlplane] Wrote Static Pod manifest for component kube-scheduler to "/etc/kubernetes/manifests/kube-scheduler.yaml"
[etcd] Wrote Static Pod manifest for a local etcd instance to "/etc/kubernetes/manifests/etcd.yaml"
[init] Waiting for the kubelet to boot up the control plane as Static Pods from directory "/etc/kubernetes/manifests".
[init] This might take a minute or longer if the control plane images have to be pulled.
[apiclient] All control plane components are healthy after 35.502655 seconds
[uploadconfig] Storing the configuration used in ConfigMap "kubeadm-config" in the "kube-system" Namespace
[markmaster] Will mark node pcmaster as master by adding a label and a taint
[markmaster] Master pcmaster tainted and labelled with key/value: node-role.kubernetes.io/master=""
[bootstraptoken] Using token: f6c541.c662a40901c4d5f3
[bootstraptoken] Configured RBAC rules to allow Node Bootstrap tokens to post CSRs in order for nodes to get long term certificate credentials
[bootstraptoken] Configured RBAC rules to allow the csrapprover controller automatically approve CSRs from a Node Bootstrap Token
[bootstraptoken] Configured RBAC rules to allow certificate rotation for all node client certificates in the cluster
[bootstraptoken] Creating the "cluster-info" ConfigMap in the "kube-public" namespace
[addons] Applied essential addon: kube-dns
[addons] Applied essential addon: kube-proxy

Your Kubernetes master has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

You can now join any number of machines by running the following on each node
as root:

  kubeadm join --token f6c541.c662a40901c4d5f3 192.168.1.100:6443 --discovery-token-ca-cert-hash sha256:29d***************************58df0d08d9e

ここで、最後にWorkerノードがKubernetesクラスタにJoinするときのコマンドが表示されますので、ひかえておきます。

#  kubeadm join --token f6c541.c662a40901c4d5f3 192.168.1.100:6443 --discovery-token-ca-cert-hash sha256:29d***************************58df0d08d9e

ちなみにkubeadmをリセットするときは次のコマンドで。

# kubeadm reset

以下のコマンドでFlannelをデプロイします。

# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.9.1/Documentation/kube-flannel.yml
clusterrole "flannel" created
clusterrolebinding "flannel" created
serviceaccount "flannel" created
configmap "kube-flannel-cfg" created
daemonset "kube-flannel-ds" created

これで、Masterノードのセットアップが完了しました。 バージョンやクラスタの構成を確認しておきます。

$  kubectl version
Client Version: version.Info{Major:"1", Minor:"9", GitVersion:"v1.9.0", GitCommit:"925c127ec6b946659ad0fd596fa959be43f0cc05", GitTreeState:"clean", BuildDate:"2017-12-15T21:07:38Z", GoVersion:"go1.9.2", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"9", GitVersion:"v1.9.0", GitCommit:"925c127ec6b946659ad0fd596fa959be43f0cc05", GitTreeState:"clean", BuildDate:"2017-12-15T20:55:30Z", GoVersion:"go1.9.2", Compiler:"gc", Platform:"linux/amd64"}

$ kubectl get node
NAME       STATUS    ROLES     AGE       VERSION
pcmaster   Ready     master    4m        v1.9.0

Nodeの参加

クラスタが構築できたので、Workerノードを参加させます。 Workerノードで、Masterノードでクラスタ構築時に生成されたkubeadm joinコマンドを実行します。

簡単ですね。 Docker Swarmと同じ感じです。

kubeadm join --token f6c541.c662a40901c4d5f3 192.168.1.100:6443 --discovery-token-ca-cert-hash sha256:29dce90e3679eaf201af51160aa6996ac2dd9d0b4bfa9c1096b2858df0d08d9e

動作確認その他

我が家には2系統のクラスタがあって、古いPCをあつめてつくったPCクラスタと、Raspberry Pi3をつかったラズパイクラスタがあります。 ラズパイクラスタは完全にネタなのですが、今回のPCクラスタのほうは、どちらも、どれぐらい計算時間がかかるかわからないが、たいして急いでもないので、クラウドで課金したくない!ジョブを投入するために使っています。

ということで OpenFOAMで、chtMultiRegionSimpleFoamソルバーのheatExchangerを解いてみました。 乱流モデルはRASModel/kEpsilonで、熱交換器内部流れと外部の空気流れを連成して計算しています。

OpenFOAM5.0のDockerイメージはこちらで。

f:id:dr_asa:20171219093832p:plain

ParaViewでの可視化は、基本的人権を満たした程度のノートPCではただただ辛い。

サンタさん!Microsoft Surface Book 2 の最上位モデルを私に!!!

TensorFlowをKubernetesで分散学習するためのKubeFlowを動かしてみた話

Kubernetesが機械学習基盤としてKubeflowをリリースしました。

ざっくりいうと、KubeFlowは以下の機械学習アプリケーション開発の一連のワークロードをサポートするOSSです。

f:id:dr_asa:20171215162737p:plain

  • モデル開発基盤

データサイエンティストや機械学習エンジニアがJupyterNotebookをつかってモデル開発するための、Jupyterが動くサーバ環境を提供

  • TensorFlow分散学習基盤

開発したモデルをTensorFlowで分散学習するためのKubernetesクラスタを自動生成

  • アプリ公開基盤

学習済みモデルをKubernetesクラスタ上でサービス公開する基盤を提供(Tensorflow Serving)

github.com

まだ、開発途中、かつざっとしか追えていませんが、導入のしかたと概要をまとめます。

0. kubeFlow環境構築

Kubeflowを動かすためには、まずKubernetesクラスタを構築しなければいけません。 今回は検証のためなので、雑にminikubeを使っています。

手順は以下のとおりです。

minikubeのインストール

MacOSのときは、次のコマンドでminikubeをインストールします。

$ brew cask install minikube

Kubernetesクラスタの構築

次のコマンドを実行して、Kubernetesクラスタを構築します。

$ minikube start
Starting local Kubernetes v1.8.0 cluster...
Starting VM...
Getting VM IP address...
Moving files into cluster...
Setting up certs...
Connecting to cluster...
Setting up kubeconfig...
Starting cluster components...
Kubectl is now configured to use the cluster.
Loading cached images from config file.

バージョンは次の通りです。

$ minikube version
minikube version: v0.24.1

$ kubectl get node
NAME       STATUS    AGE       VERSION
minikube   Ready     10m       v1.8.0

これで準備は完了です。

なお、基本的人権を満たさないPCを使っているみなさまと プロキシ環境で無駄に人生を消耗しているみなさまは AWSやAzureやGCPなどのパブリッククラウドVMかKubernetesマネージドサービス使ってください。

Kubeflowのインストール

KubeflowはGitHubで公開されていますので、次のコマンドでクローンします。

$ git clone https://github.com/google/kubeflow

ここでは、CPUを使って分散学習する例を説明します。 次のコマンドを実行して、環境を構築します。

$ cd kubeflow
$ kubectl apply -f components/ -R

なお、KubeflowはGPUもサポートしています。正確には、Kubernetes1.8からGPU対応がα提供されているので、Nvidia CUDAなどで後日動かしてみたいとおもいます。

環境構築のためのマニュフェストファイルは、kubeflow/components配下にあります。

1. モデル開発基盤

KubeFlowではモデル開発のため、JupyterNotebookが動作する環境が用意されます。 KubeFlowは、JupyterHubを使用しています。なので複数のユーザーでの認証アクセスを管理でき、「spawners」と呼ばれるプラグイン可能なコンポーネントをつかってます。

JupyterNotebookはKubernetesのPodで動きます。

$ kubectl get pod
NAME                                                READY     STATUS    RESTARTS   AGE
~中略~
tf-hub-0                                            1/1       Running   0          2h
tf-job-operator-5c648c58bc-vrtcx                    1/1       Running   0          2h

JupyterNotebookにアクセスするためのPodは「tf-hub-lb」という名前のServiceがLoadBaranceとして公開されています。

tf-cnn $ kubectl get svc
NAME                                          CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
~中略~
tf-hub-0                                      None             <none>        8000/TCP         2h
tf-hub-lb                                     10.107.227.23    <pending>     80:32089/TCP     2h

minikubeの場合は、次のコマンドで公開URLを確認できます。

$ minikube service tf-hub-lb --url
http://192.168.99.100:32089

f:id:dr_asa:20171215131202j:plain

カスタムのJupyterNotebookを使いたいときや構成を変更したいときは、以下のマニュフェストを修正します。 kubeflow/components/jupyterhub/manifests/

2. TensorFlow分散学習基盤

チュートリアルや書籍のサンプル程度のモデルであれば、 使っているPCやクラウドVMのシングルインスタンスで大丈夫ですが 実務で使うような大規模なものであれば、計算量も膨大になるため、(コストを見ながら)計算基盤をスケールさせる必要があります。

TensorFlowの分散学習処理を行う際は、3種類のノードをつかいます。

  • Master
  • Parameter Server
  • Worker

Kubeflowでは、Kubernetesクラスタをつかって分散クラスタを構成し、その上でTensorFlowの分散処理コードを動かす環境が用意されています。

MasterとParameter Serverは1〜2ノード、Workerは計算に必要な沢山のノードが動きます。

Kubeflowのサンプルコードが用意されているので次のコマンドで実行します。 このサンプルは、tf_cnn_benchmarksを使用して畳み込みニューラルネットワークを学習するためのものです。

ソースはこちらですね。

benchmarks/scripts/tf_cnn_benchmarks at master · tensorflow/benchmarks · GitHub

次のコマンドでKubernetesクラスタにJobを投入します。

$ cd kubeflow/tf-controller-examples/tf-cnn/
$ kubectl create -f tf_job_cpu_distributed.yaml 
tfjob "inception-171202-163257-cpu-3" created

しばらくすると、次のようなPodが生成されます。

kubectlコマンドで確認すると、inception--master-/inception--ps-がそれぞれ1つずつ inception--worker-が3つできているのがわかります。

$ kubectl get pod
NAME                                                READY     STATUS              RESTARTS   AGE
inception-171202-163257-cpu-3-master-vjo4-0-hc2kl   0/1       ContainerCreating   0          18s
inception-171202-163257-cpu-3-ps-vjo4-0-728vm       0/1       ContainerCreating   0          18s
inception-171202-163257-cpu-3-worker-vjo4-0-h66bn   0/1       ContainerCreating   0          18s
inception-171202-163257-cpu-3-worker-vjo4-1-lcljx   0/1       ContainerCreating   0          18s
inception-171202-163257-cpu-3-worker-vjo4-2-j59bh   0/1       ContainerCreating   0          18s
model-server-6598c6486d-b8rxg                       1/1       Running             1          6m
model-server-6598c6486d-clwz9                       0/1       Pending             0          6m
model-server-6598c6486d-dkmsk                       0/1       Pending             0          6m
tf-hub-0                                            1/1       Running             1          6m
tf-job-operator-5c648c58bc-47c7f                    1/1       Running             1     

KubeFlowでつかうマニフェストファイルは以下のようになっています。 ポイントとなるところだけ抜粋します。

apiVersion

apiVersionで「tensorflow.org/v1alpha1」を、kindで「TFJob」を指定してます。 kindは「Job」ではないので注意です。

apiVersion: tensorflow.org/v1alpha1
kind: TfJob
Master Pod

MasterのPodをreplicaSpecsで指定します。 実行したいジョブのコマンドやパラメータの指定で、通常のKubernetesマニュフェストファイルと同じですが [tfReplicaType]を「MASTER」にしています。 また、[replicas]が1なので、Podが1つ上がります。

spec:
  replicaSpecs:
  - replicas: 1
    template:
      spec:
        containers:
        - args:
          - python
          - tf_cnn_benchmarks.py
          - --batch_size=32
          - --model=resnet50
          - --variable_update=parameter_server
          - --flush_stdout=true
          - --num_gpus=1
          - --local_parameter_device=cpu
          - --device=cpu
          - --data_format=NHWC
          image: gcr.io/kubeflow/tf-benchmarks-cpu:v20171202-bdab599-dirty-284af3
          name: tensorflow
          workingDir: /opt/tf-benchmarks/scripts/tf_cnn_benchmarks
        restartPolicy: OnFailure
    tfReplicaType: MASTER
Parameter Server

同様にParameter ServerのPodを定義しています。 Parameter Serverは[tfReplicaType]が「PS」で [replicas]が1なので、Master同様Podが1つ上がります。

  - replicas: 1
    template:
      spec:
        containers:
        - args:
          ~中略~
          name: tensorflow
          workingDir: /opt/tf-benchmarks/scripts/tf_cnn_benchmarks
        restartPolicy: OnFailure
    tfReplicaType: PS
  tfImage: gcr.io/kubeflow/tf-benchmarks-cpu:v20171202-bdab599-dirty-284af3
Worker Pod

最後に計算Podです。 Parameter Serverは[tfReplicaType]が「WORKER」で [replicas]が3なので、計算用Podが3つ上がります。

  - replicas: 3
    template:
      spec:
        containers:
        - args:
          ~中略~
          name: tensorflow
          workingDir: /opt/tf-benchmarks/scripts/tf_cnn_benchmarks
        restartPolicy: OnFailure
    tfReplicaType: WORKER

この構成で分散して学習が行われます。

今回はKubernetesクラスタをminikubeで構成していますが、たとえばGKEなどをつかうときは、NodePoolを構成して、プール内に適切なスペックのノードをおけばよいかとおもいます。

TensorFlowの分散学習の実装については、enakaiさんのブログがわかりやすいです。

分散学習用TensorFlowコードの書き方 - めもめも

3. アプリ公開基盤

KubeFlowのアプリ公開には、Tensorflow Servingが使われています。 今回は、minikubeで確認したので試してませんが GCPなどでクラスタを構成して 学習済みのモデルをGCSにアップロードしてアプリで利用する流れです。

github.com

DevFest2017で、「プログラマのためのGoogle Cloud Platform超入門」というタイトルで GKEを簡単に紹介するセッションをさせていただきましたが そこで、TensorFlowで画像推論する基盤をデモとして動かしました。

ほぼ、同じようなアーキテクチャなのでご参考までに。

感想

世間やメディアで大変な賑わいをみせている深層学習界隈は、人間がAIに仕事を奪われるたぐいのファンタジーからはじまり、 クールなアルゴリズムの話題、論文を実装してみました速報、ツール/フレームワークを使ってみました日記や 深層学習でこんなすごいことできました選手権などの情報にあふれ、とてもきらきらまぶしく膨大過ぎて追いかけきれてないのですが、、、、

このような基盤構築や地味な方法論は、とても楽しいので、細々と調べながら手を動かしたいと思いました。

まだ開発途中のようですが、ひそかにウォッチしたいとおもいます。

おわり

GTC Japan 2017(@NVIDIA) に参加しました

2017/12/12(火)~12/13(水)にお台場ヒルトン東京で開催された、NVIDIA主催 GTC Japanに参加しました。 昨今のAIブームによる大変な賑わいで、かなり人に酔ってしまいましたがとても興味深いセッションや展示がたくさんでした。

簡単ですが、ログを記録です。

TensorFlow:Open Source Machine Learning

Google.Inc Wolff Dobson

ML/DLのオーバービュー/TensorFlowとは何か?

TensorFlowの動作環境

  • CPU/GPU/TPU/Android/iOS/IoT
  • NVIDIA CUDA/Intelで動作

    TensorFlow Eager Execution

  • Define-by-Runでモデルを記述できるパッケージ
  • モデルのデバッグが容易
  • インストールはpip install tf-nightly
  • GPUも使える
  • コードはかなり楽に書けるが、パフォーマンスはよろしくない

    TensorFlow Lite

  • Android向けTensorFlowライブラリ
  • Flatbuffersでシリアライズ(ゲーム向けのもの)
  • バイス用でモデルを動かすためバイナリが10分の1
  • ハードウエアアクセラレーション有(Android Neural Network APIなど)

    Magenta ProjectおよびSketch-RSSの紹介

TensorFlow Liteのアーキテクチャ概要 f:id:dr_asa:20171214153234j:plain

TensorFlow LiteのデモをするGooglerをTensorFlow Liteを使って実装したAndroidアプリで推論したところ f:id:dr_asa:20171214153604p:plain

CUDA9 Deep Drive

エヌビディア合同会社 成瀬さん

CUDA9とは

  • Volta対応/Tesla V100/Tensorコアオーバービュー

    Volta対応

  • Voltaアーキテクチャ概要
  • NVLink(300GB/sec)/VoltaMPI対応
  • DLだけではなくHPCでも使用

    Tensorコア

  • 4×4の行列を1サイクルで計算
  • 16×16行列を32スレッドで協調実行
  • 行列積算のためのテンプレートを容易
  • WMMAテンプレートでTensorコア用のデータ型を用意
  • WMMA:ロード命令
  • WMMA:行列乗算
  • WMMA:ストア命令  など
  • WARP同期用ビルドイン関数あり

    cuTLASS(ver0.1)

  • CUDAカーネルが使用できる高性能な行列積テンプレート(DL向け)

    Cooperative Groups

  • スケーラブルで柔軟性の高いスレッド間同期通信機構
  • 協調動作するスレッドグループの定義/分割同期が容易にできる
  • スレッドブロック内/シングルGPU内/マルチGPU間それぞれで使える
  • マルチグリッドグループは粒子シミュレーションや時間発展系の演算で使う

    その他開発ツールおよびライブラリの改善

Deep Lerning with Apache MxNet and Gluon

Amazon Web Services Inc Sunil Mallya/Joseph Spisak

"AI is the new Electoricity"

  • あらゆる産業でデータサイエンスが進む。メディアだけでなく医療/ファイナンス/カスタマーエクスペリエンスなど
  • データサイエンティストの仕事を楽にすることがAWSの目的
  • (インフラ)-(フレームワーク)-(プラットフォーム)-(サービス)すべてのレイヤーでサービスを提供する

    Amazon SageMaker

  • MLモデルを大規模に構築/トレーニング/デプロイするためのサービス
  • MLはデータ前処理やトレーニングだけでなく、継続してアプリをデプロイすることが重要(かつ、難しい)
  • フレームワークアルゴリズムを選択可能(Apache MXNetやTensorFlowなど)

    DeepLens

  • 開発者向けの画像推論用カメラ
  • review

    Gruon

  • DL用のフレームワーク(API?)
  • Microsoftと協業
  • Apache MXNet/Caffe2/CNTKなどを選べる
  • 分散学習も可能
  • 文法はPythonに酷似(デモを見たけど非常に簡潔だった)
  • Github上にCNNやRNNのサンプルがある

    その他ビデオ認識/音声認識/翻訳などのAPIも公開

    AWSの強固なパートナー戦略

  • エンタープライズ顧客での導入事例
  • 日本国内でも展開(開発者の教育に力を入れる)
  • 特にMLに関してはMicrosoftとの協業を強調

AI・ビックデータ技術の最先端の研究開発・社会実装を加速する計算基盤 東工大TSUBAME3.0

東京工業大学 松岡先生/国立研究開発法人産業技術総合研究所 小川さん

スパコンに求められるもの(社会基盤)

TSUBAMEの歴史

  • 2000年~15年にわたり開発
  • 2011年にGordon Bell賞受賞

    ABCIの紹介

  • ラージスケールAI向けスパコン
  • アカデミアと産業のコラボによる開発
  • 東京大学柏キャンパスに建築中
  • ペタバイト級大規模モデリングをサポート
  • 2018年春~夏にリリース予定
  • 1088台の計算ノード 4352GPU
  • 富士通2U2サーバ NVIDIA TeslaV100 Infiniband
  • 1ラックで1PFLOPS
  • Water/Air Hybrid Cooling Systems
  • ソフトは今後公開予定

大規模有限要素解析とAIによるモンテカルロ地震動強度分析

東京大学 藤田先生

SC17でBest Poster Award受賞

研究概要

  • HPCによる地震動の有限要素解析による物理シミュレーションを行った結果画像をもとに、DLを使って学習を行い地震対策シナリオを作る
  • レイヤー化された地盤構造データを用意
  • 地底内部はあいまいさがあるのでモンテカルロシミュレーション
  • 10km×10kmを50mの分解能で解析
  • 非線形波動方程式を解くため大規模な計算が必要
  • 計算を安定化させるため陰解法を採用

有限要素解析

  • 京コンピュータ(理研
  • 10.6PFLOPS
  • ソルバーは自作(前処理方程式を荒く解くことで共役勾配法を使う)
  • 行列ベクトル積の高速化のため、非構造格子を構造格子にする

DLによる推論

  • 8350m×7200mで50mの分解能で20段階で壊れやすさを評価するAIを作成
  • 24360データセット使用(一部テストセット)
  • Chainerで実装
  • シミュレーションのような精度はでないもののそこそこの推論が可能
  • 計算量がシミュレーションに比べはるかに少ないので有用

解くべき波動方程式 f:id:dr_asa:20171214153752j:plain

感想

セッションの数はDLメインでしたが、HPCブースの賑わいは熱くどのセッションも満席立ち見でした。 企業ブースは日本HPやIBMDellなどのハードウエアベンダーだけでなく、RedHatやシスコ、またHPC系のソルバーを扱うベンダーや仮想化ソフトウエアのベンダーなども出展されていていました。 クラウドベンダーではAWSの出展がありましたが、休憩時間ではブースに近寄れないほどの大盛況ぶりでした。

昨今のAIブームはやや過熱気味なところもあるかもしれませんが、HPCやDLなどの高度な数理を必要とする技術はこれからますます重要になってくるので、しっかりウォッチしたいなと思いました。いやいやいやいや、ウォッチするだけではなく自分でコードを書く必要があるなと。

あと、(やはり)アカデミックからの発表が多く、イケてる勉強会は学会、イケてるハンズオンは大学の講義、イケてる書籍は大学の教科書なのだよなと。高度な応用技術・最先端の実装を理解するための、基礎が大事だと改めて。

最後に、心ときめいた♥写真の数々です。 f:id:dr_asa:20171214153844j:plain f:id:dr_asa:20171214154512j:plain f:id:dr_asa:20171214154536j:plain

Amazon Web Servicesのソリューションアーキテクトのみなさま、ご招待いただきありがとうございました😊

以上

機械学習を勉強するときはIDEっぽいJupyterLabを使うと便利

いまお仕事の関係で、機械学習の教科書的な書籍を読んだりオンライン講座を受講したりしながらサンプルやチュートリアルを動かして勉強しています。

以前にこちらのエントリーで機械学習の『勉強環境』としてJupyterNotebook/Dockerを使っています、というチラシの裏紙っぽいエントリを書いたところ、「Dockerのスペルが違うじゃないか、いい加減にしろ」というフィードバックを頂きました。

dr-asa.hatenablog.com

が、最近「JupyterLab」なるものがあると知り、これがなかなか便利なのでいつも使っています。 ということで、機械学習の勉強環境を構築するためJupyterLabの動くDockerイメージを作ったので、簡単にご紹介です。

1.JupyterLabとは

JupyterLabはJupyter Notebookをベースに拡張したIDEで、ブラウザで動作します。

色々な機能がありますが、まずなによりもターミナルが同一画面で使えるのが便利です。Google Cloud ShellやAzure Cloud Shellにすっかり慣れてしまったゆとりなので、ありがたい。

f:id:dr_asa:20171006121313p:plain

また、タブで画面分割ができチュートリアルやお手本のサンプルコードと自分の書いたコードを見比べながらチェックできるので、勉強環境にはぴったりです。 f:id:dr_asa:20171006120431p:plain

JupyterLabの公式リポジトリはこちらです。

github.com

2. JupyterLabを使うには

このJupyterLabを使えるDockerイメージ「asashiho/ml-jupyterlab」をDockerHubで公開していますのでそれをもとに、次のコマンドで「ml-container」という名前のDockerコンテナを起動します。 Dockerのインストールは、こちらで簡単に紹介しています。

コマンドのpオプションは、コンテナで転送するポート番号を指定してます。 ここでは、JupyterLabが8888番ポートを使っています。

$ docker run -p 8888:8888 --name ml-container -it asashiho/ml-jupyterlab

コンテナは、[Ctrl]+[C]で停止できます。

また、バックグラウンドで動いている場合は、次のコマンドでコンテナを起動/停止できます。

$ docker container start ml-container
$ docker container stop ml-container

コンテナは、次のコマンドで削除できます。

$ docker container rm ml-container

なお、コンテナを削除するとデータも消えますので、データを消したくないときは docker runコマンドでコンテナを起動するときに、Dockerのホストマシン(お使いのPCやクラウドインスタンス)をディレクトリをvオプションでマウントしてください。

Dockerコンテナが起動できたら、ブラウザから以下のアドレスにアクセスしてJupyterNotebookを使います。 アクセス先のURLは、docker runコマンドを実行したときのコンソールに表示されますので、パスに/labを追加してください。

クラウドインスタンスの場合は、以下のアドレスでアクセスできます。

http://DockerホストのIPアドレス:8888/lab?token=<your token>

MacOSまたはWindowsPCのローカル環境の場合は、以下のアドレスでアクセスできます。

http://localhost:8888//lab?token=<your token>

こんな感じです。

f:id:dr_asa:20171006121953p:plain

3. 環境をカスタマイズしたくなったときは

Dockerイメージは「Dockerfile」という定義ベースのファイルで実行環境の構成を管理しています。

このファイルをカスタマイズし、Dockerfileをビルドすることで、任意のDockerイメージを作成できます。たとえば、Pythonのバージョンを変えたい、TensorFlowを最新にしたい、足りないライブラリがあった、など。

今回お試しで使ったDockerイメージのもとになるDockerfileをGithubで公開してますので、ご参考までに。

github.com

無理のない、よい機械学習の勉強ライフを。

「機械学習の書籍を読む」ために必要な数学やりなおしの書籍

「AIを使って我が社のビジネスを・・・」
がたいへん流行っているようです。

そんな中、技術の1つの分野として機械学習を勉強しておきたい!というプログラマの人もたくさんいるとおもいます。が、しかし、機械学習の良書や優れたWeb記事を読むためには、数式が理解できなければページをめくることができません。

数式なしでも分かる機械学、、、方面にいってしまうのも1つの手としてありますが、やはり肝心なところが理解できず、表面をかすっただけになってしまうのも残念です。

では、数学苦手な人は挫折するしかないのか、、、、というのも悲しい話で
特に「ビジネスドメインに関する高度な知識がある」という方は非常にもったいないので、数式を見ると頭痛がする人は頭痛薬を飲んで、人類の輝かしい未来のためにぜひ復習していただけるいいなと思っています。


機械学習を理解するために必要な数学は大きく分けて

があると思いますが、理系大学の学部(教養課程)で習うレベルまで理解できていれば、少なくとも「機械学習の書籍を読み進める」ことはできます。

そこで、「理系だけど昔過ぎて忘れてしまった」「そもそも文系なので大学で数学を履修していない」という方向けに読みやすく復習に向いている(と私が思う)数学の本をいくつか紹介します。

ふたたびの微分積分

そもそも微分とはなんぞや、積分とはなんぞや、からの解説が豊富にあります。具体的な例をつかって、変化率とは?傾きとは?数列とは?面積をともめる!みたいな、人間にとって想像しやすい切り口で解説されています。


www.amazon.co.jp


やさしく学べる線形代数

機械学習に限らず、線形代数が理解できていれば人生得することが多いので、ぜひとも線形代数だけは、、、という感じでもあります。中学のときに習う連立方程式みたいなのから始まり、丁寧な解説付きの練習問題を解くことができるので読みやすいかと思います。

www.amazon.co.jp


完全独習 統計学入門

度数分布・平均・標準偏差のあたりからものすごく丁寧に説明されています。中学程度の知識で読み進められます。独習方式なので詰むことも少ないのではないかと思います。

www.amazon.co.jp



ニューラルネットワーク自作入門

ニューラルネットワークで使われる数学をこれでもかといわんばかりに丁寧に説明した入門書です。行列計算なども具体的な数値を入れて、例を出して解説しています。前提知識は、高校程度の数学だとおもいます。
www.amazon.co.jp


これを読んで「理解できた!実装もできた!」という方は、技術評論社の「ITエンジニアのための機械学習理論入門」がおすすめです。


ここからは、ドメイン知識を前提にした数学の本の紹介です。ご紹介できるのが偏ってますが。。。

金融・証券のためのブラック・ショールズ微分方程式

証券の勉強するため良いよと銀行マンの友達におすすめしてもらった本です。

文系=数学苦手、、、というのは都市伝説だろ!!!!としか思えないほど、金融クラスタは数字に強い人が多いです。それは、彼ら彼女らが就職後に、大学で履修していなかったにもかかわらず、数学をこつこつ勉強した結果なのであって、素晴らしいなと!


ブラックショールズの微分方程式の導出と解き方を丁寧に解説されていて、分かりやすいうえに、面白いです(笑)ぜひ読んでみてください!

www.amazon.co.jp

証券アナリストのための数学再入門

証券の知識があまりなくても、読み進められます。資格試験の本らしく練習問題ありなので理解度チェックもできます!

www.amazon.co.jp




なお私自身が漫画や小説のような「文書が構造化されていない読み物」がほとんど理解できないため、、、、対話で分かる○○、とかイラストで学ぶ▲▲のような本はおすすめ対象外にしています。しかし数学が苦手な人の中には、もしかしたら小説のようなストーリ性のある本のほうが理解が進むという人もいるかもしれません。大きな本屋さんにいくと、たくさんの数学本が売られていますので、自分にあったものを1冊選んで読んでみると良いかなーと思います。

これからのプログラマには、プログラミング力に加えて、深いドメインナレッジやサイエンスの知識が求められるため「なんて生きづらい世界なんだ!!!」だとは思いますが、やってみるとわりと楽しいので、あまり苦手意識や先入観を持たずに、紙と鉛筆で解いてみると良いかもしれません。




10/22(日)に開催される技術書典3という同人誌のためのイベントに「技術者のためのやさしい数学 vol.2」という本を頒布します。本格的にガロア理論が勉強できます。数学好きな方ぜひぜひ会場で~♥

techbookfest.org


こちらは前回の技術書典2で頒布させていただいたものです。
www.dlmarket.jp

© 2017 ASA.