エムスリーテックブログ

エムスリー(m3)のエンジニア・開発メンバーによる技術ブログです

エムスリーは #RubyKaigi 2017 にスポンサーとして参加しました

エムスリーエンジニアの松原 @ma2ge です。

2017/09/18から09/20に広島にて開催された RubyKaigi 2017 にて Gold Sponsor としてスポンサーしました。 弊社からは今年4月新卒入社の加藤 @m3_ryo_kato2 と私松原の2名が参加しました。 今回初めてスポンサーブースも設置させていただき、swag にはマスクとうちわをご用意しました。

f:id:ma2gedev:20170927121419j:plain
エムスリースポンサーブース version 1.0

周りのスポンサーブースを見渡すとみなさまテーブルクロスをしておりましたので慌ててパッチを当てて version 2.0 をリリースし直しました。

f:id:ma2gedev:20170927121517j:plain
エムスリースポンサーブース version 2.0

ブースに訪れていただいたり、話しかけていただいたりと皆様ありがとうございました。 お好み焼き美味しくて広島も最高でしたね。

www.instagram.com

エムスリー と Ruby

Kaigi 中「エムスリーが Ruby を使っていることを知らなかった。」という声をいくつかいただいたのですが、 2012 年くらいから本格的に使い始め、今では大体 40 〜 50% くらいのアプリが Rails で作られており、メインの言語の一つとなっております。

Ruby コミュニティへの貢献という形では、Tokyo RubyKaigi 11 での Ruby3 Sponsor、昨年の RubyKaigi 2016 で Gold Sponsor をさせていただいております。

次の RubyKaigi 2018 は仙台ということですので、何らかの形で引き続き継続したいと考えております。

f:id:ma2gedev:20170927121932j:plain
次の RubyKaigi 2018 は仙台

ちなみに Rails が半分くらいという話をしましたが、Ruby 以外の言語も色々と使っていて、それらのコミュニティへもスポンサーしてたりします。この辺りの話はまた別の機会に。

個人的によかったと思う2つのセッション

いずれもよかったのですが、個人的観点で2つ選ぶならコレというものをあげさせていただきます。

Pattern Matching in Ruby

1つは @yotii23 さんのパターンマッチを Ruby に入れるという話です。 理由は Ruby 本体に手を入れて、さらにそのリポジトリを公開もしているという点と、私が Elixir 言語信者という点です。

@yotii23 さんは Programming Elixir を日本語訳し出版されている方でもあるのですが、 Elixir 言語のコードを例示しながらパターンマッチの紹介をしてくれました。 私も Elixir を書くときはパターンマッチを使いますし、 Ruby にも入ってくれたら嬉しいと思っていたので、興味深くセッションを聞いておりました。 ちなみにエムスリーも Elixir を本番で使っていますが、これはまた次の機会に話します。

Ruby とパターンマッチでいうと、いくつかの gem があります。 例えばセッションでも紹介されていた、@k-tsj さんの pattern-match gem ですとか、 Egison 言語を作られている @egison さんの egison gem とかですね。

ですが本発表では gem ではなく Ruby 本体を変更してしまうというところが新鮮で面白かったと思います。 またそのコードを公開されておりますので、同じようにすることで自分自身でも再現ができますし、 目的に対してどのように Ruby を変更していくのかも分かるので私としては大変勉強になりました。

Resources

Memory Fragmentation and Bloat in Ruby

2つ目は @nateberkopec さんで Ruby のメモリに関するパフォーマンスの話です。 こちらを選んだ理由はメモリ消費事例について分かりやすく説明してくれたこと、 スライドが Deckset で作られていて私も Deckset ユーザの一人で共感したためです。

@nateberkopec さんは The Complete Guide to Rails Performance の著者で、Rails のパフォーマンスについてのコンサルタントをしておられるようです。 今回の発表では Ruby のメモリに関するパフォーマンス劣化を引き起こす原因をいくつか紹介しながら、 Ruby の下回りの仕組み、対処方法について紹介してくれました。

例えば以下のような事例を紹介してくれました。

  • RailsUser.all.each { |u| ... } を実行してしまう(これはよく耳にする事例ですね)
    • ユーザ数が多い場合に一気にメモリが消費される
  • Puma が Unicorn よりもメモリを消費するケース(スレッドモデルなので驚きました)
    • 特にスレッドをたくさん作って、その上でメモリも確保するようなアプリケーション
    • glibc にスレッドごとのメモリアリーナ機能というものがあり、スレッドごとにメモリ領域(アリーナ)を確保するためにこのようなことが起こり得る

対処方法については Ruby コード側でなんとかするというのもあるのですが、Ruby がメモリ管理をしているのだから、 なるべく Ruby コードでは意識しないようにしたいということで以下のようにいくつか紹介されていました。

  • glibc のメモリアリーナ機能で確保されるメモリ領域を抑えるために MALLOC_ARENA_MAX 環境変数の設定を見直す
  • glibc ではなく別の malloc 実装、例えば jemalloc を使う(jemalloc はメモリのフラグメンテーションに効くようです)

ただし何れにしてもトレードオフの関係があることは意識しておく必要があります。例えば MALLOC_ARENA_MAX の値を下げることでメモリ消費量は減るが、その分メモリのロックを取る確率が上がり速度が下がるなど。

私としては Puma のメモリ消費事例、スレッドごとのメモリアリーナ、jemalloc のいずれについても知らなかったことでしたので、 知ることができてよかったですし、Ruby の下で何が起こってるかについて少しだけ詳しくなり有意義な時間となりました。

Resources

最後に

毎回思うのですが RubyKaigi のクロージングはこみ上げるものがありますね。年々涙腺が弱くなっている身としては、堪えるのがだんだん辛くなってきております。 クロージングでも言われていたのでここでも言いますが、今回の RubyKaigi には仕事として参加しており、旅費周り含めてサポートもしてもらっております。

エムスリーではエンジニア仲間を募集しています!

エムスリーでは Ruby, Rails などのテクノロジーを活用して医療に貢献するエンジニアの仲間を募集中です!勉強会の見学やカジュアル面談も随時受け付けてますのでご興味があれば以下よりご応募ください!

エムスリー機械学習ミニコンペを開催しました! #m3dev

こんにちわ。エムスリーのエンジニアまえはりん @maeharinです

先日エムスリーのAIチームメンバーが主催で機械学習のミニハッカソンを開催しましたので、その様子をレポします。場所はYahoo!JAPANのコワーキングスペース『LODGE(ロッジ)』

f:id:m3tech:20170915073204j:plain

お題はワインの品質当て!

お題は「ワインの要素(アルコール度数とかpHとか)とその品質(10段階のクオリティ)のデータを元に、品質を予測するモデルを作成してその精度を競おう」というもの

【課題】

  • ワインの品質を予測するモデルを作成しましょう。
  • モデルの精度はaccuracyを10 fold cross validationで評価。
  • データ・セットは次のURLからダウンロードできます!!
  • 赤ワインと白ワインのデータがあるが、赤ワインのデータを使う
  • 当日に着手してもいいですし、事前に準備しても構いません。AWS使ってもいいですよー。猫型のAIも利用可です。

この人が主催者。エムスリーのAIチームのエース(通称:インテリラガーマン)。今回の私の目標はこの人を倒すこと

f:id:m3tech:20170915073153j:plain

機械学習ニコンペ開始!

やり方は人それぞれ。python + scikit-learnで頑張る人や、TensorFlow使う人など様々

モデルの選択やパラメータチューニングをモクモク

私はwindows azure mlで勝負

windows azure mlならデータソースをアップロードして、GUI上でモデルや評価手法を選択してつなげていくだけなので楽ちん。データソースの概観をvisualizeすることもできるし(分散や散布図をサクッとみれる)

f:id:m3tech:20170915113809p:plain

モデルを変えて再実行したりも簡単。ローカルPCよりも実行時間は早そう。これなら機械学習初心者でも勝機があるかも!?

f:id:m3tech:20170915114049p:plain

スコアが上がったり下がったりの中盤戦

精度が出ないからってPCに念を送り出すI氏

f:id:m3tech:20170915073237j:plain

が、精度あがらず

f:id:m3tech:20170915073226j:plain

コンペ終盤、激しいデットヒート

チューニングを重ねていった私が暫定一位に!うほほほほ!

しかし、他のメンバーのサポートをしていたN氏(通称:インテリラガーマン)がものすごい勢いで追い上げてくる

結果発表

デッドヒートの結果は…

f:id:m3tech:20170915073249j:plain

私は2位!結局AIチームのエースを倒す目的は叶わなかったですが、機械学習初心者にしては上出来かな(^ω^)

ハッカソン後はリアルワイン品質品評会で締め!

f:id:m3tech:20170915073305j:plain

エムスリーではエンジニア仲間を募集しています!

エムスリーでは機械学習などのテクノロジーを活用して医療に貢献するエンジニアの仲間を募集中です!勉強会の見学やカジュアル面談も随時受け付けてますのでご興味があれば是非ご応募ください!