AI時代のDocker + XaaS簡単理解

私が所属しているDeNA AIシステム部の部内勉強会でDockerとXaaS(ザース)の話をさせていただいたので資料を公開します。
XaaS(ザース)はIaaS, FaaS, SaaSなどの総称です。

資料は大きく「Docker編」と「XaaS編」から成っており、普段業務でなんとなくDockerやクラウド(IaaS)を使っている方向けに、これらの概要を説明する資料となっています。

部内向けということもありいくつかの項目を省略しましたので、この記事で補足します。

前提と聴衆

まず部内では自明なこととして資料中では聴衆の関心事やスキルセットを端折っていますが以下のような方を対象としています。

  • Dockerを使用する必要/関心がある
  • IaaS(クラウド)を使用する必要/関心がある
  • 機械学習等でGPUの計算リソースを必要としている
  • (Web)アプリケーションエンジニア ではない
  • DevOpsやML Ops ではない

つまり部内の大勢を占めるAIリサーチャーやデータサイエンティストの方を対象として作った資料です。
また、5月ということもあり新卒入社してくださったメンバーが部内に多くいることも考慮に入れています。

本資料を発表した部内勉強会は事前にトピックが公開されている任意参加の社内イベントで、当日は概ね30名の方が参加してくださいました。

意識したこと

スライドの最初の方にスクリーンショットを貼っていますが、今回の資料を作るにあたってAIリサーチャー/データサイエンティストの方に「Dockerにどれくらい慣れ親しんでいるか」事前アンケートを取らせていただきました。

このアンケート結果から、部内に「Dockerに慣れている方」から「Dockerを自分では使ったことがない方」まで幅広く存在していることを改めて認識しました。

このような聴衆が想定される中、特に今回は「Dockerよくわからない」と感じている方の"よくわからなさ"をポイントを絞って解消したいと考えました。

例えば設定例やコマンドラインオプションは今後SlackやIssueコメントでサポートできますしチートシートのリンクを紹介して試していただくこともできます。

しかしエンジニア組織において「そもそもの仕組みや考え方がわからない」状態は健全ではなく、AIリサーチャーやデータサイエンティスト間でのコードレビューの障害となり得ます。
個々人としてはよくわからないまま使うことで頭の中のワーキングメモリを無為に消費し続け苦手意識を持ち続けてしまうこともあるでしょう。

一方で、AIリサーチャー/データサイエンティストの皆さんがDockerやIaaSを深く知る必要はないためマニアックな内容にならないよう気をつけました。

またIaaSについては私のようなDevOps/ML Opsエンジニアが環境構築や仕組みの提供を行えるため概要紹介に留めました。

Docker編

アンケート結果からDockerを使いこなしている方が半数程度居り「隣の人に聞ける」状況ではあることが読み取れたため、「Dockerとは何か」といった全く初めての人向けの話は端折りました。

またWebサービスの開発のように複数Dockerコンテナを同時実行するよりは、個々のDockerコンテナでJupyter Notebookなどを起動するケースが多いと想定しネットワークに関しても触れていません。

代わりに普段意識する機会の少ないであろうコンテナの概要を説明することで、今後"Docker on Mac(=Linux)とmacOSで同じファイルを参照した際のOSの違いによるハマり"などに遭遇しても解決しやすくなるよう構成を考えました。

Dockerfile

DockerイメージをビルドするためのレシピとなるDockerfileは「存在と役割は知られている、あるいは周りの方がサポート可能」と判断し説明しませんでした。

これは社内のGitHub Enterpriseを検索したところ、AIリサーチャーやデータサイエンティストの方が主にcommitしているリポジトリに既に多くの Dockerfile が存在したことによります。

Docker Compose

一方で複数Dockerコンテナの管理ツールであるDocker Composeは Dockerfile ほどには設定ファイルが存在せず、また普段のSlack上の会話などからも「興味はあるが使っていない」「使い方や使い所がよくわからない」といった声があり、導入が進んでいないことを把握していました。

そのため極めて単純な例から順に内容を増やしていくサンプルを用意しました。
そのサンプルはこちらのリポジトリで公開しています。

201905.note.brief-description-of-docker-and-xaas-in-the-ai-era/sample-files

Dockerベストプラクティス

またDockerビルド時のベストプラクティスを、パフォーマンスとセキュリティそれぞれの観点から全員に押さえていただきたいポイントに厳選してご説明しました。

1つはDockerfileの書き方によってイメージサイズを増やさない方法です。

これは1行ずつ複数の RUN が書かれた Dockerfile をいくつか目にしたためです。

どうしても機械学習関連のDockerイメージはサイズが大きくなる傾向があり、今後ますますDockerの活用が進んだ際にストレージコストは無視できなくなる可能性があるため今のうちに共通認識を持っていただきたいと考えました。

もう1つはBuildKitの --mount=type=secret の使い方と効果の説明です。

業務上GitHubのPrivate RepositoryやAmazon S3、Google Cloud Storageにアクセスするための秘密鍵やCredentialsを取り扱うことは多々あり、Dockerビルド時に必要となるケースも増えていくと想定されます。

Dockerの新しいbuilderであるBuildKitでは、Dockerビルド時にこれらの秘匿すべきデータを安全に取り扱うことができるので「もしそうしなかったらどう危険なのか」とともに紹介しました。

時間が足りずデモはできなかったのですが、サンプルリポジトリに例があります

当日は以上2つのベストプラクティスのみ紹介しましたが、こちらの資料に2019年5月時点のベストプラクティスがまとまっています。
この資料は「Container Build Meetup #02」に参加した際教えていただきました 😄

またGoogle Cloudの「Best practices for building containers」もとても良いドキュメントだと思います。
当日も参加いただいた部内の若者がSlackに貼ってくれていました 😄

XaaS(ザース)編

XaaSについては言葉の整理をしつつ、AWS上でGPUインスタンスを起動してDocker Composeを使ってDockerコンテナを動かすデモを行いました。

先述の通り、部内ではAIリサーチャー/データサイエンティストの方がAWSやGCP上の込み入ったインフラを構築する必要はないため、以下のようなポイントに絞って説明したいと考えました。

  • IaaS, FaaS, SaaSなど「* as a Service」に種類があり名前がついていること
  • XaaS、特にIaaSは便利であると同時に危険性が伴うこと
  • 部内の環境はInfrastructure as Code(IaC)という考え方で構成されていること

ただ、時間をオーバーしてしまい最後はかなり駆け足になってしまいました。

デモ環境の構成

デモでは次のような極めてシンプルなAWS上の機械学習インフラを使いました。

この環境を作るサンプルは次のリポジトリで公開しています。

terraform-aws-simple-vpc/examples/simple-ml

Infrastructure as Code(IaC)を実現するツールはTerraformのみを使っており、サンプルはTerraform Moduleになっています。

またTerraformを実行時にIPアドレスを取得し接続元としてAWSのセキュリティグループ(ファイアウォール)を設定することで、業務でよく使われるであろう接続元IPアドレスによるアクセス制御を実現しています。

Terraform実行は数分程度の時間がかかりますし、内容の詳細を知っていただきたい訳ではなかったため事前に2倍速の動画として用意しておきました。
YouTubeに同じ動画をアップロードしています。

AWSアカウントを1つ用意してこのサンプルを適用していただくと、READMEの最後のようにTensorFlowが使えるJupyter Notebookが起動でき、Dockerコンテナ上からも nvidia-smi コマンドでGPUが接続されていることを確認できるはずです。

もちろん業務で扱っている環境はもう少し複雑な作りになっているのですが、社内独自の作り込みなどは検索しても情報が得られないため、あくまで一般に公開されている情報とツールを使ってデモ環境を構成しています。

反応

今回話をさせていただいた部内勉強会は、普段は機械学習やデータサイエンスのトピックが多くこの内容は話す側としてとても不安でした。

終了後にアンケートを取らせていただいたのですが、思ったよりも「参考になった」と回答してくださった方が多く準備した甲斐がありました。

「使ってみようと思った」と「自分でもやってみようと思った」は後から追加したのですが、すでに多くの方が回答済みだったからか1票も入らずでした。。

参考資料

最後に今回の資料の構成検討と制作にあたっては参考にさせていただいた資料を紹介します。

初めてDockerを触るところからマンガで説明されており、初心者の方の入門書としてはもちろん、導入や表現も大変勉強になりました。

#マンガでわかるDocker ③ 〜AWS編〜まで読むとAmazon ECS上でDockerコンテナを動かす方法まで一通り学べます。

Dockerがどのような技術で成り立っているか、Linuxを含めて開設されている書籍です。
2015年に出版された本ですがLinux Namespaces等の主要機能は大きく変わっておらず変わらず参考になります。