こんにちは、ウォンテッドリーでデータサイエンティストをしている林 (@python_walker) です。
ウォンテッドリーでは、テクノロジーの力で人と仕事の適材適所を実現するために推薦システムの開発を行っています。今回この記事で紹介するのは、データサイエンティストが良い推薦システムを爆速で開発するのを可能にする、便利な内製ツールです。
背景;ウォンテッドリーで使われている開発環境 ウォンテッドリーが提供しているビジネスSNS「Wantedly Visit」はKubernetes上で運用されており、エンジニアは普段の開発もKubernetes上で行う機会がとても多いです。特に、Kubernetesを操作するためのツールとして有名な kubectl
をラップした kube
というツールを開発し利用しています。 kube
についてはウォンテッドリーが公開しているHandbookでも紹介がされているので、興味のある方はぜひ呼んでみてください。
kube
の機能の中でも特に kubefork
という機能は擬似的にKubernetesクラスタをコピーし、自分専用のデプロイ先として用いることができるため、普段の開発の生産性を大きく向上させています。
データサイエンティストも同様にKubernetes上で開発を進めていくという体制を取っていましたが、必要なリソース量が一般的に多いことやクラスタ上の他のサービスとのつながりが構成上あまり深くなかったので、 kubefork
は使わずにリソース量を指定して開発用のPodを立ててそこに接続して開発をするという運用を取っていました。
kube sandbox sh main
kube
コマンドを使ったPodを立てる最も簡単なコマンドは上のようなもので、sandbox環境で今いるリポジトリのmainブランチの内容でPodを立てて、Podに対してKubernetest APIを通して shコマンドでシェルを実行して接続するという動作をします。
課題;開発に使う際の使い勝手 kube
でPodを立てた場合、本番運用とほとんど同じ環境が用意されるので、書き上がったコードを動作確認するために使う際にはとても便利な機能です。しかし、開発途中に限ってみると使い勝手にはいくつか課題がありました。
Podの中身は永久には保存されない CLIのみが用意されているツールなのでグラフの描画などは行えない 本番運用時の環境に近いので、開発時のみに必要になるようなツールはほとんど入っていない Pod内で作業していてPodの内部で exit
を実行してシェルから抜け出したり、何も指定ない状態を一定時間続けるとPodは消えてしまいます。このとき、作業内容や生成物はGCSやS3のような外部ストレージなどに保存しない限りPodと一緒に消えてしまいます。
また、先程書いたコマンドからある程度予想できた方もいると思いますが、Pod内の操作はすべてシェルを通して行う必要があり、3とも関連しますがssh serverなども入っていないのでVSCodeなどに繋いで計算結果をグラフにして表示するといったことも簡単にはできませんでした。さらに、vimやemacsなどのツールも最初からは入っていないので、Podを立てるたびに最低限使いやすいように各自設定しないとコードを書くということも困難でした。
ちなみに、自分がこの体制で開発をしていたときにPodを立てるたびに行っていたことは以下のような感じです。Podは休憩などしてPCがスリープなどに入ってしまうと簡単にスッと消えてしまうので、このコマンドは毎日3~4回は実行していました。面倒くさいですね。
$ apt update && apt install -y vim $ git config --global user.name "Yudai Hayashi" $ git config --global user.email "xxx@xxx.com" $ mkdir ~/.ssh $ vim ~/.ssh/config $ touch ~/.ssh/ $MY_SSH_KEY $ chmod 600 ~/.ssh/ $MY_SSH_KEY $ export GITHUB_USERNAME = xxx $ export GITHUB_ACCESS_TOKEN = xxx $ git config --global url.https:// $GITHUB_USERNAME : $GITHUB_ACCESS_TOKEN @github.com/.insteadOf https://github.com/
解決策;新たなツールSARAの開発 上記の課題を解決するために、 kube
をさらにラップする形で SARA (Seamless Accessible Resource Allocator) というツールを新たに開発し始めました。SARAは当時の推薦基盤チームのnasa(@k-nasa)さんが主導で開発を進め、今は林が保守・追加の機能追加を主に担当しています。SARAは以下のような機能を提供します。
Kubernetes上に必要な分のリソースを指定してPodを立てることができる Podに対してSSH接続をして開発することができる Podのベースとなるイメージ内にあるツールに加えて、開発時によく使うツールはインストールされた状態で作業を始められる Pod内の作業ディレクトリは永続化され、Podを立て直したときも同じ場所から作業を再開することができる 起動後はアイドル状態が一定以上継続すると自動的にPodが落ちる SARAの起動フロー SARAは kube
のラッパーのような立ち位置にいるため、SARA自体はユーザーからコマンドを受け取って kube
を通してKubernetesを操作します。
SARAのコマンドが実行されると、 kube
を通して永続化ボリュームの呼び出しと指定したDocker imageに対してPodが作成される Podが起動したらディスクをPodにマウントする ディスクが初期状態の場合にはPodのworkspaceで指定されたディレクトリからコードをコピーしてくる ここまででPodとボリュームが用意されます。ここからさらにPodで開発できるように以下のような作業が行われます。
SSHサーバーの設定、起動 認証情報の設定 (Pod内&ローカルPC) Port forwardデーモンプロセスの起動 ローカルPCとの接続 このプロセスにより、Podが起動したら自動的にローカルPCにport forwardされ、例えばVSCodeを使っていれば何もしなくてもRemote ExploreにPodの名前が表示されるようになり、そこから接続することで開発を始めることができます。このように、SARAは kubeが提供している
Kubernetesリソースを扱う便利なインターフェースを活用して、さらにKubernetes上での開発体験を一層向上させています。
sara
コマンドの実行ログ
❯ sara start -v DEBUG Deleting k8s resources .. . DEBUG k8s resources: { .. . } DEBUG Finished deleting k8s resources INFO Starting machine .. . DEBUG Creating k8s resources .. . DEBUG k8s resources: { .. . } DEBUG Creating PVC .. . DEBUG pvc already exists DEBUG Creating Pod .. . DEBUG Finished creating k8s resources DEBUG Configuring SSH .. . DEBUG Configuring working directory .. . DEBUG copy working directory: INFO Started machine - The data in the directories under /xx is persistent. Forwarding from xxx - > xx Forwarding from xxx - > xx INFO Waiting for port forwarding .. . DEBUG Update SSH config file Handling connection for xxx Warning: Permanently added 'xxx' to the list of known hosts. INFO All setup processes done. INFO You can connect to the host with name xxx.
SARAによって改善した点 まず最初に、SARAによってデータサイエンティストの開発者体験は大きく改善したと考えています。使い慣れた環境で開発できるようになったのはもちろん、実験結果が保存されて後で確認などができるようになったのは、ML開発をするうえでとても大きな開発体験の向上だったと感じています。また、SARAの機能のところで少し触れたように、一定時間以上何も実行しないまま放置すると勝手に落ちてくれるので、使っていないのにリソースをずっと確保してしまうという事態も防げるのも良い点だと感じています。
We're hiring! 私たちと一緒に、推薦システムという技術活用を促進して人と会社の理想的なマッチングを追求するデータサイエンティスト・機械学習エンジニアの仲間を探しています。少しでも私たちの取り組みに興味を持っていただけたら、以下の募集から「話を聞きに行きたい」ボタンをクリックしてください!