Slide 1

Slide 1 text

Copyright © OPTiM Corp. All Right Reserved. いつの間にか社の中核製品に Rustが使われていた件について OPTiM 齋藤 Rust.Tokyo 2019 2019/10/26 @リクルートホールディングス

Slide 2

Slide 2 text

Copyright © OPTiM Corp. All Right Reserved. 2  自己紹介  オプティムとは?  オプティムのRust採用プロジェクト  なぜオプティムはRustを採用したのか?  さいごに 目次

Slide 3

Slide 3 text

Copyright © OPTiM Corp. All Right Reserved. 3 自己紹介

Slide 4

Slide 4 text

Copyright © OPTiM Corp. All Right Reserved. 4  H/N: あずんひ(az nh e2 1 )  使用ブラウザ: Netscape~ Firefox 2.x~  Rust歴:1.0(ベータ?)~ • Rust 1.0:2015/5/15 • Rust 1.1:2015/6/25  オプティム歴:2017/4~ R&Dチーム 自己紹介 TWITTER, TWEET, RETWEET and the Twitter logo are trademarks of Twitter, Inc. or its affiliates. FirefoxのロゴはMPL 2.0によってライセンスされており、著作権はMozillaに帰属します RustのロゴはCC-BYによってライセンスされており、著作権はMozillaに帰属します

Slide 5

Slide 5 text

Copyright © OPTiM Corp. All Right Reserved. 5 2019/10/26までに投稿したブログ  Rust 1.33を早めに深掘り (3/1)  Rust 1.34を早めに深掘り (4/12)  Rust 1.35を早めに深掘り (5/24)  Rust 1.36を早めに深掘り (7/5)  Rust 1.37を早めに深掘り (8/16)  Rust 1.38を早めに深掘り(9/27)  必修言語Rustの他己紹介 (1/7)  Rustのカバレッジを極める (2/19)  Rustの未来いわゆるFuture (7/5)

Slide 6

Slide 6 text

Copyright © OPTiM Corp. All Right Reserved. 6 オプティムとは?

Slide 7

Slide 7 text

Copyright © OPTiM Corp. All Right Reserved. 7 オプティムを1枚の絵で表してみた

Slide 8

Slide 8 text

Copyright © OPTiM Corp. All Right Reserved. 8  Optimal Biz • 国内シェアNo1のMDM(モバイルデバイス管理)システム  タブホ • 900を超える雑誌のバックナンバーが読み放題の 雑誌読み放題サービス オプティムを1枚の絵で表してみた – デバイス編

Slide 9

Slide 9 text

Copyright © OPTiM Corp. All Right Reserved. 9  Cloud IoT OS • ID・権限管理、データの蓄積、 配信などを備えた 「プラットフォームのための プラットフォーム」 • LANDLOGやAI Cameraなど、 各種サービスはこの上に構築 されている オプティムを1枚の絵で表してみた – Cloud IoT OS編

Slide 10

Slide 10 text

Copyright © OPTiM Corp. All Right Reserved. 10  お米配給制度 • 給料に上乗せしてお米の支給を受けられる制度  Optimal Second Sight • スマートグラスを使用した遠隔作業支援システム  Agri Field Manager • 田畑をドローンなどで撮影してAIで解析することで、 ピンポイント農薬散布など、効果的な生育管理を 可能にするプラットフォーム  Agri Assistant • 自動音声入力などにより農作業の記録を 支援するシステム  OPTiM Agri Drone • 各種カメラを搭載可能なマルチコプタードローン  OPTiM Hawk • 長距離飛行が可能な固定翼型(飛行機型)の ドローンで、広範囲のデジタルスキャンが可能 オプティムを1枚の絵で表してみた – 農業編

Slide 11

Slide 11 text

Copyright © OPTiM Corp. All Right Reserved. 11  OPTiM Doctor Eye • 眼底画像診断支援システム • 緑内障診断支援システム(医療機器認証済)  AMIAS • オプティム以外も含めたAIメーカーのための 医用AI統合オープンプラットフォーム  Smart Home Medical Care • 病院内と同じような見守りを実現する在宅医療パッケージ オプティムを1枚の絵で表してみた – 医療編

Slide 12

Slide 12 text

Copyright © OPTiM Corp. All Right Reserved. 12  LANGLOG • 国交省の推進するi-Constructionを具現化する、 建設現場向けオープンプラットフォーム • 現場の建設機械をカメラで撮影し、 AIで解析することで現場の可視化・効率化が可能 オプティムを1枚の絵で表してみた – 建設編

Slide 13

Slide 13 text

Copyright © OPTiM Corp. All Right Reserved. 13  AI Camera • ネットワークカメラから送られてくる動画をAIで解析することにより、 店の混雑状況の可視化、危険予知、業務改善が可能 • AI Camera LiteやAI Camera Mobileなど、 コストを抑えたサービスも登場  AI Store • 無人店舗を始め、AIを含む様々な技術を組み合わせて 小売の省力化を実現するサービス オプティムを1枚の絵で表してみた – AIサービス編

Slide 14

Slide 14 text

Copyright © OPTiM Corp. All Right Reserved. 14 オプティムを1枚の絵で表してみた

Slide 15

Slide 15 text

Copyright © OPTiM Corp. All Right Reserved. 15 オプティムのRust採用プロジェクト①

Slide 16

Slide 16 text

Copyright © OPTiM Corp. All Right Reserved. 16  トマトの輪郭を検出し、熟度を判定、収穫まであと何日かを表示するデモ  USBカメラの映像を受け取り(Rust)、リアルタイムで解析し(Python) 、 サーバーからクライアントに引き渡し(Rust)、ブラウザで表示する(JavaScript) • 第2回AI・人工知能EXPOで展示 • Initial commit: 2018/04/05 • 恐らくオプティム初の採用事例?  裏側 • USBカメラからの読み込み:ffmpeg-rs • Pythonの呼び出し:rust-cpython • Python2/3のどちらかのみ使用可能 • HTTPサーバー:nickel.rs • これらによって、1プロセス内で 「カメラからの読み込み」 「推論」「RESTサーバー」が完結  Rust採用理由 • 趣味 トマトの熟度判定デモ Rust Python

Slide 17

Slide 17 text

Copyright © OPTiM Corp. All Right Reserved. 17 オプティムのRust採用プロジェクト②

Slide 18

Slide 18 text

Copyright © OPTiM Corp. All Right Reserved. 18  眼底カメラで撮影した眼底画像を画像処理で解析し、緑内障の可能性を示すシステム  医療機器プログラムとして認証を取得 眼底画像診断支援システム OPTiM Doctor Eye 齋藤の眼底と解析結果

Slide 19

Slide 19 text

Copyright © OPTiM Corp. All Right Reserved. 19  眼底カメラから送られてきた画像を、管理サーバーを経由して受け取り(Rust)、 解析し(Python)、管理サーバーに返す(Rust) • 先程のトマトの発展系 • Initial commit: 2018/07/06  裏側 • 子プロセスとの通信:ipc-channel • HTTPサーバーはactix-web • Pythonの呼び出しはrust-cpython • マルチプロセス化によりPython2/3を 同時に利用可能になった  Rust採用理由 • 趣味 眼底画像診断支援システム OPTiM Doctor Eye Rust Python

Slide 20

Slide 20 text

Copyright © OPTiM Corp. All Right Reserved. 20  rust-cpythonを使うと Rustの中にPythonを組み込める • pythonバイナリを使うわけではないが、 環境はシステムのものを使うので pythonのインストールは必要 • PyO3というクレートもあるがnightly限定 • indocクレート:インデントを省いて 文字列リテラル化してくれる  PyBufferを使おう • コピーコストが格段に減る • 使わない場合 • Rustの&[u8]->Pythonのlist->np.ndarray • メモリ確保、コピーが2回 • 使う場合:np.ndarray<-&[u8] • メモリ確保、コピーが1回 • 先にndarrayを確保(30行目)して、 そこにコピー(31行目)する形 rust-cpythonについて解説

Slide 21

Slide 21 text

Copyright © OPTiM Corp. All Right Reserved. 21 オプティムのRust採用プロジェクト③ 細かいやついくつか

Slide 22

Slide 22 text

Copyright © OPTiM Corp. All Right Reserved. 22  menohを使用した顔検出 • menoh:CPUでも高速な推論フレームワーク • 写真から顔だけを切り出すツールをGPUのないマシン向けに作りたかった  Rust採用理由 • 趣味 • menohの公式バインディングがあったから 細かいやつ①

Slide 23

Slide 23 text

Copyright © OPTiM Corp. All Right Reserved. 23  深層学習のデータセット構成ファイル管理ツール  必要性 • データセットを単体のファイルにしたかった • データセット内部のファイル名がデータセットごとに違ったりするのを吸収したかった • クラス名などのメタデータをデータセットの中に入れたかった  Rust採用理由 • 趣味 • ファイル数が膨大(数万~数百万)なのでちょっとでも早い方が良い・・・かもしれない 細かいやつ②

Slide 24

Slide 24 text

Copyright © OPTiM Corp. All Right Reserved. 24 オプティムのRust採用プロジェクト④

Slide 25

Slide 25 text

Copyright © OPTiM Corp. All Right Reserved. 25  パイプライン化により処理を効率化  NVIDIA GPU、Edge TPUへの対応により広範なプラットフォームに対応  Rustによって低オーバーヘッド、落ちないソフトウェアを実現 AIカメラのコア(ミドルウェア)の特徴 OPTiM Edgeシリーズ – Edge TPU搭載プロトタイプ

Slide 26

Slide 26 text

Copyright © OPTiM Corp. All Right Reserved. 26 AIカメラの構成(公式イラスト)

Slide 27

Slide 27 text

Copyright © OPTiM Corp. All Right Reserved. 27 AIカメラの構成(いらすとやで分かりやすく) AIカメラ Web側インター フェース LAN 映像 AIカメラ エッジ側 インターフェース AIカメラ ミドルウェア 解 析 結 果 設 定 情 報

Slide 28

Slide 28 text

Copyright © OPTiM Corp. All Right Reserved. 28 パイプライン化による高速化の秘密 – 非パイプライン処理 待機 待機 待機 待機 待機 待機 待機

Slide 29

Slide 29 text

Copyright © OPTiM Corp. All Right Reserved. 29 パイプライン化による高速化の秘密 – パイプライン処理

Slide 30

Slide 30 text

Copyright © OPTiM Corp. All Right Reserved. 30  裏側 • 推論:NVIDIA GPU(独自バインディング)/Edge TPU(独自バインディング) • HTTPサーバー:なぜかhyper (サーバーが本来の仕事ではないとは言え・・・) • チャネル:crossbeam-channel(std::sync::mpscよりも高速) • トレーシング:rustracing_jaeger • メトリクス収集:rust-prometheus • 画像描画:image / imageproc • テキスト描画:rusttype  Rust採用理由 • C++つらたん • 当初、EEの奥村がC++で作っていたが、あまりの苦しさから他の言語に救いを求めた結果、巷(席周辺)で話題のRustを 採用 • 当時チームには奥村を除きRustユーザーが3人(自然発生) • CとのFFIが苦でなく、既存ライブラリを有効活用できる AIカメラのコア(ミドルウェア)

Slide 31

Slide 31 text

Copyright © OPTiM Corp. All Right Reserved. 31  排他制御がつらい • mutexをロックしなくても変数にアクセスできてしまう恐ろしさ • チャネルさえあれば・・・  ライフタイム管理がつらい • その参照・ポインタは本当に生きているのか?  テンプレートがつらい • そのテンプレート関数が本当にコンパイル通るか分かりますか?  パッケージ管理がつらい • レポジトリからは何に依存しているのか分からない • 別の環境に持って行くと依存関係が変わったりする  ビルドがつらい • CMake?Ninja?  非同期処理がつらい • ブロッキング?コールバック? こんなことがあっても大丈夫。そう、Rustならね C++のつらいところ

Slide 32

Slide 32 text

Copyright © OPTiM Corp. All Right Reserved. 32  • •  •  •  • •  •  • C++のつらいところ→Rustなら?  排他制御が楽 • Mutexはロックしないとデータにアクセス出来ない設計 • チャネルはstd::sync::mpsc/crossbeam-channel  ライフタイム管理が楽 • コンパイラが全部面倒を見てくれる  テンプレートが楽 • ジェネリクスによって常にコンパイルが通る  パッケージ管理が楽 • cargoによって依存関係が完全に管理  ビルドが楽 • cargoによってデバッグ/リリースの切り替え・実行・ビルドが ワンストップで可能  非同期処理が楽 • Futureによるゼロコスト抽象化 • async/await(Rust 1.39~)

Slide 33

Slide 33 text

Copyright © OPTiM Corp. All Right Reserved. 33  依存関係が多過ぎる(右図) • クリーンビルドで5分以上掛かる • cargo tree –all-featuresが739行  それもそのはず機能がモノリシックに詰まっている • RTSP受信(自作) • MP4パース(自作) • AVIパース・生成(自作) • H264デコード • YUVデコード・エンコード(バインディング自作) • JPEGデコード・エンコード(バインディング自作) • WebMエンコード(バインディング自作) • HTTPサーバー • WebSocket • NVIDIA GPU対応(バインディング自作) • Edge TPU対応(バインディング自作) • 推論結果の可視化 • トレーシング • メトリクス収集  ダイエットしなければ・・・ AIカメラのコア(ミドルウェア)、肥大化中

Slide 34

Slide 34 text

Copyright © OPTiM Corp. All Right Reserved. 34 なぜオプティムはRustを採用したのか

Slide 35

Slide 35 text

Copyright © OPTiM Corp. All Right Reserved. 35  趣味 • R&Dチームでは、Rust以外にもElmを(趣味で)使ってる人もいる  安全性 • セグフォやリソース競合が原則として発生しない • enumの分岐漏れや未処理のエラーなどを忘れることがない  高速性 • 単純なプログラムではC/C++と同程度の速度 • ゼロコスト抽象化や高度なライブラリによってC/C++を上回る • どうしてもパフォーマンスが必要な場合などはunsafeブロックにより「檻」を抜け出すことが出来る  エコシステム • rustupで全てが入るので開発環境の構築が楽 • cargo buildで(ProtoBufからなど)コード生成も含めて一発で全て終わるので楽  FFI • NVIDIA GPUやEdge TPUなど、デバイスにアクセスするようなものは大抵C/C++製だが、それら資産を使用可能 なぜオプティムはRustを採用したのか

Slide 36

Slide 36 text

Copyright © OPTiM Corp. All Right Reserved. 36 さいごに

Slide 37

Slide 37 text

Copyright © OPTiM Corp. All Right Reserved. 37  WebAssembly • wasiでプラグインとかやってみたい  画像処理の最適化 • image/imageprocクレートが遅く、Rustでの画像処理がつらい 将来的にRustを活用したい分野

Slide 38

Slide 38 text

Copyright © OPTiM Corp. All Right Reserved. 38  テックブログをよろしくお願いします • Rustの新バージョンを解説する記事をリリース日の朝に出しています • 他にもRustの記事を始め、様々な記事を出しています  エンジニア交流イベント「OPTiM TECH NIGHT」も毎月の開催を予定しています オプティムではRustエンジニアを募集しています! さいごのさいごに OPTiM TECH NIGHT@目黒雅叙園の様子

Slide 39

Slide 39 text

Copyright © OPTiM Corp. All Right Reserved. 39