AWSの機械学習プラットフォームSageMakerを使ってみた

AWSの新サービスである機械学習プラットフォーム SageMakerを触ってみました。ざっくり言うとデータ処理、学習、作成したモデルをコンテナとしてデプロイするという一連の作業をAWS上で提供されるJupyter Notebook上で行うことができるというものです。

aws.amazon.com

SageMakerで作成したJupyter Notebookには最初からいろんなサンプルがついているのでまずはこれらで動きを確かめてみました。

f:id:takezoe:20171206171818p:plain

データなどを準備した後、create_training_job()メソッドに必要なパラメータを渡すと自動的に必要なインスタンスが用意され学習が行われます。サンプルでは学習データはS3に置いておかれており、生成された予測モデルは指定したS3上のパスに保存されます。ちなみに独自のアルゴリズムを使用したい場合はDockerイメージを用意する必要があるみたいです。

同じくcreate_endpoint()メソッドでHTTPのPOSTメソッドでアクセス可能なエンドポイントができます。パラメータでインスタンス数を指定できるので冗長化はできるようですが、APIリファレンスを見た感じモデルを更新した場合などの再デプロイする場合はエンドポイントを一回削除して作り直すか、別のエンドポイントを作成する必要がありそう。

ダッシュボードにはこんな感じでノートブック、学習ジョブ、モデル、エンドポイントの状態が表示されます。

f:id:takezoe:20171206172133p:plain

これらのワークフローに乗るためにはSageMakerのライブラリの使い方を覚える必要があります。デフォルトで付属しているサンプルや以下の開発者ガイドに目を通しておくとよいと思います。

docs.aws.amazon.com

ただ、必ずしもSageMakerのワークフローに乗らなくてもよいのかもしれません。たとえば入力データをAthenaから持って来たり、SageMakerのジョブを使わずに学習を行うということもできそうです。AWS上のリソースを活用するためのマネージドなJupyter Notebookとして使うのもありなのかもしれません。

GitBucketプラグインの開発をサポートするsbtプラグインを作りました

少し前からこんなsbtプラグインを作っていたのですが、使えそうな感じになってきたので紹介記事を書きたいと思います。

github.com

このプラグインはGitBucketプラグインのsbtプロジェクトに以下の機能を提供します。

使用するにはproject/plugin.sbtに以下の記述を追加します。

addSbtPlugin("io.github.gitbucket" % "sbt-gitbucket-plugin" % "1.2.0")

build.sbtにはGitBucketのバージョンのみ指定すればOKです。

gitbucketVersion := "4.19.0"

GitBucketはプラグインのオートリロード機能を持っているので、ローカルでGitBucketを立ち上げた状態でプラグインソースコードを編集したらsbt installを実行すればプラグインの動作確認を行うことができます。GitBucketを再起動する必要もありませんし、セッションも切れないので結構快適に開発ができると思います。

sbt install<HOME>/.gitbucket/pluginsディレクトリにプラグインのjarファイルをコピーしますが、環境変数GITBUCKET_HOMEシステムプロパティgitbucket.homeが設定されている場合はそちらを優先します。また、完成したプラグインをリリースする場合はsbt assemblyで生成されたtarget/scala-2.12/<プロジェクト名>-assembly-<バージョン番号>.jarを配布すればOKです。

将来的にはプラグインのリモートリポジトリからのインストールをできるようにしたいと考えているのですが、その際に必要となるであろうメタデータファイルの生成などもこのプラグインでできるようにしたいと考えています。いつになるかわかりませんが…。

以下のGitBucketプラグイン用のテンプレートプロジェクトもこのsbtプラグインを使うように更新されていますので、このテンプレートを使用することで簡単にGitBucketプラグインの開発を始めることができます。

github.com

もし新しいプラグインを作成した場合は是非GitBucket Community Pluginsに掲載させていただければと思いますのでご連絡ください!

GitBucket 4.19.0をリリースしました

4.19.0には本体およびバンドルされたプラグインにいくつかの問題があったため、修正した4.19.3をリリース済みです。こちらをご利用ください。 https://github.com/gitbucket/gitbucket/releases/tag/4.14.3

Scalaで実装されたオープンソースのGitサーバ、GitBucket 4.19.0をリリースしました。

https://github.com/takezoe/gitbucket/releases/tag/4.19.0

Mavenリポジトリプラグインが利用可能に

GitBucket上にMavenリポジトリをホストするgitbucket-maven-repository-pluginが利用可能になりました。

f:id:takezoe:20171129183533p:plain

このプラグインをインストールすると以下の2つのMavenリポジトリが利用可能になります。

  • http(s)://GITBUCKET_HOST/maven/releases
  • http(s)://GITBUCKET_HOST/maven/snapshots

このMavenリポジトリに対してWebDAVまたはSCPでアーティファクトをアップロードすることができます。このプラグインや、具体的な設定についての詳細はプラグインREADMEを参照してください。

Scalatra 2.6へのアップデート

GitBucketはWebフレームワークとしてScalatraを使用しています。Scalatraはこの11月にメジャーアップデートである2.6がリリースされ、GitBucket 4.19.0も早速Scalatra 2.6系に移行しました。

Scalatra 2.6での大きなトピックの1つとして、これまでGitBucketのオーガニゼーションで開発していたscalatra-formsがScalatra本体のサブモジュールとして移管されたということがあります。今回のリリースではGitBucketのコードベースも移管後のものを使うように修正されていますが、これは既存のGitBucketプラグインのバイナリ互換性を壊す可能性があります。もし動作しないプラグインを見つけた場合はプラグインの作者に知らせてください。

この他に、Scala、sbt、JGitのバージョンがアップデートされています。また、日付関係の処理はJava8のDate & Time APIを使用するように修正され、joda-timeへの依存関係が削除されています。

システム設定画面のレイアウト改善

システム設定画面のレイアウトや挙動が少しだけ変更されています。その中でやや大きな変更点はスキンセレクタのプルダウンで、配置や選択項目がわかりやすい形に変更された他、スキンを選択するとその場でスキン適用後の表示を確認できるようになりました。

f:id:takezoe:20171129183547p:plain

新しい拡張ポイントの追加

新しい拡張ポイントとしてsshCommandProviderを追加しました。プラグインはこの拡張ポイントを使用してユーザからのSSHアクセスをハンドリングすることが可能です。実際に前述のgitbucket-maven-repository-pluginはこの拡張ポイントを使用してSCPでのアーティファクトのアップロードを実装しています。

なお、今回のバージョンではScalatra 2.6向けの修正が間に合わなかったため、gitbucket-pages-pluginが一時的にバンドル対象から外されています。修正完了後、将来のバージョンで再度バンドルされるようになる予定です。また、この他にも様々な改善やバグフィックスを行っています。詳細についてはIssueの一覧をご覧ください。

Apache PredictionIOのインストール方法(バイナリディストリビューション版)

Apache PredictionIOのハウツーについては以前以下の記事でインストール方法からテンプレートを使ったレコメンドAPIのデプロイまでを紹介しました。

takezoe.hatenablog.com

当時のPredictionIOはインストールするにはソースからビルドするべしというかなりスパルタンなインストール方法だったのですが、最新のPredictionIO 0.12.0-incubatingではバイナリディストリビューションもリリースされるようになっていますので、こちらを使用したインストール方法について補足したいと思います。

まだ公式サイトのインストールガイドにはリンクがありませんが、以下からバイナリディストリビューションをダウンロードできます。

http://ftp.meisei-u.ac.jp/mirror/apache/dist/incubator/predictionio/0.12.0-incubating/apache-predictionio-0.12.0-incubating-bin.tar.gz

展開するとPredictionIO-0.12.0-incubatingというディレクトリが出てきます。

$ tar xvzf apache-predictionio-0.12.0-incubating-bin.tar.gz

展開後のディレクトリにSparkをインストールします。PredictionIOはSpark 1.6、2.0、2.1に対応していますが、バイナリディストリビューションはSpark 2.1向けにビルドされています。

$ wget https://archive.apache.org/dist/spark/spark-2.1.1/spark-2.1.1-bin-hadoop2.6.tgz
$ mkdir PredictionIO-0.12.0-incubating/vendors
$ tar zxvfC spark-2.1.1-bin-hadoop2.6.tgz PredictionIO-0.12.0-incubating/vendors

ストレージにPostgreSQLを使う場合はPostgreSQLJDBCドライバも必要です。

$ cd PredictionIO-0.12.0-incubating/lib
$ wget https://jdbc.postgresql.org/download/postgresql-42.0.0.jar

以上でインストール完了です。

バイナリディストリビューションといってもSparkやJDBCドライバを追加インストールする必要があったり、テンプレートのコンパイルにsbtをインストールしておく必要があったりするのは相変わらずですが、ソースからビルドする必要がないので少しだけ楽になっているんじゃないかと思いますw

なお、公式のものではないのですが、コミュニティで作られているDockerイメージもいくつかあるので、こちらを利用することもできます。

ロープロファイルなメカニカルキーボードを買ってみた

少し前にネット上で話題になっていたこのキーボードが気になっていたものの青軸ということで躊躇していたのですが、Amazonのレビューを見るとなかなか良さそうだし値段もそこまで高くないので試しに買ってみました。

ロープロファイル(低背)のスイッチを使っておりHHKBやこれまでのメカニカルキーボードと比べるとキーストロークがかなり浅くなっています。ノートPCなどでパンタグラフのキーボードに慣れた人でもこれなら快適にタイプできるのではないかと思います。キーストロークの浅さに加えて筐体も薄いので手首への負担も軽減できそうです。

配列はまとも(US配列のみですが)でファンクションキーやカーソルキーなどもついてるので、HHKBなどのコンパクト指向の特殊配列なキーボードと比べると若干場所は取りますが、普通に使えます。筐体やキートップにも安っぽさはありませんし、青色のバックライトも綺麗です。

一方で、やはり青軸なのでカチャカチャという音は結構しますし、青軸独特のクリック感が嫌だという人も多そうです(自分もあまり好きではありません)。ロープロファイルで茶軸や赤軸のスイッチを使った製品が出てくるといいなと思います。

ちなみに今まではThinkPadキーボードの旧モデルを使っていたのですが、MacBookをHigh Sierraにアップデートしたところセンターボタン+トラックポイントでのスクロールができなくなってしまったので、これを機にトラックポイントから卒業できないだろうかというのもこのキーボードを買った動機ですw そのためにポインティングデバイスとしてMagic Trackpad2もあわせて導入しました。

Apple Magic Trackpad 2 MJ2R2J/A

Apple Magic Trackpad 2 MJ2R2J/A

以前ロジクールの類似品を使っていたのですが、やはり操作性に雲泥の差がありますね…。先代のMagic Trackpadと比べてもめっちゃ操作しやすくなりました。

takezoe.hatenablog.com

さて、無事トラックポイントから卒業できるでしょうか…。

GitHubのスター数で見るScalaのDBアクセスライブラリ

吉田さんがこういう記事を書いていたので真似してデータベースアクセスライブラリ版を書いてみました。

xuwei-k.hatenablog.com

2009年からのグラフですが、トップ5のスター数の推移はこんな感じ。

f:id:takezoe:20171119132632p:plain

slick/slick ★1930

github.com

相変わらずの一番人気。この1年では300くらいスターが増えている。DBIOで強制モナモナやjoinしたつもりなのに何故かサブクエリになるSQLなど問題が多いのに何故こんなに人気があるのか考えさせられるものがある。クエリビルダは非常に柔軟かつ強力だけど、やはり出てくるSQLが想像もつかないのは厳しい。joinを多用するアプリケーションでは(MySQLの場合は特に)使わないほうがよいと思うし、シンプルなCRUDしかしないんだったらこんなに複雑なクエリビルダ要らないのではという気がする。

また、最近はそうでもないけどSQLだけでなく汎用的なクエリビルダを目指しておりSQL固有の機能を頑なに取り入れない方針だったのも実用性を考えるとどうなのかと思わざるを得ない。開発は活発だけどクエリビルダで組み立てたASTからSQLを生成するクエリコンパイラが死ぬほど複雑で常人はおいそれと手を出すことができない。

getquill/quill ★1077

github.com

Twitter社のエンジニアが開発しているScalaデータベースアクセスライブラリ業界の新鋭。作者の方はマーケティングにも熱心で、この1年で約900スターが増えており一気にNo.2の座に。マクロでコンパイル時にSQLを生成するというコンセプト。ちょっと試してみたところではjoinはちゃんとjoinとしてSQLが生成されており感動した。IOモナドもあるけどオプションになっているところは良心的。最近はSparkSQL対応など色気を出している。

日本だとFOLIOさんが使っているみたいで社員の方(?)がコントリビュートもしている。でもScala関西のFOLIOさんのセッションでquill微妙と言ってたのでどのへんが微妙なのか聞いてみたい。コードはちょっとしか読んでないのでよくわからないけどマクロで実装されているので拡張しづらそうだなという印象があるのと、将来的に新しいマクロシステムにちゃんと移行されるのだろうかという不安がある。

tpolecat/doobie ★973

github.com

これも新鋭でSQLを書くタイプ。1年前からは+600スター。タイプセーフじゃないけどコンパイル時やテスト時にチェックすればいいじゃんというコンセプト(らしい)。SQLを直接書くので複雑なクエリにも対応できるという安心感があるものの、動的に変わるようなSQLは書きにくい(らしい)。自分では使ったことないのでよくわからない。

IOモナド方式でもれなくScalazまたはcatsがついてくるのがちょっと微妙かもしれない。

scalikejdbc/scalikejdbc ★826

github.com

ここまでがメジャーなデータベースアクセスフレームワークの現役世代と言っていいと思う。この1年で+100スターほど。これまでと同じペースで伸びているけどquillとdoobieの伸びが大きすぎて昨年半ばの段階で順位が逆転してしまっている。

実用的なバランスがあり使いやすい。SQLを書く方式とタイプセーフなDSLの二種類の使い方があり、他のフレームワークだと大体DSLがメインで、SQL方式はDSLではできないことがある場合の回避策みたいな位置付けになっていることが多いけど(doobieは除く)、scalikejdbcは元々SQLを書く方式で後からDSLが追加されたという経緯もあり、SQLを書く方式も便利。どちらを使うべきか悩むかもしれない。

squeryl/squeryl ★493

github.com

1年で+40スターほど。最近は吉田さんがメンテを継続されている。タイプセーフなDSLタイプで結構使いやすいと思うけど内部でランタイムリフレクションが使われているのがScala界隈的には微妙なのかもしれない。今から敢えて使うかというと微妙だけど、ケースクラス作るだけでDSLが使えるのは便利(ここにリフレクションが使われている)。quillはこれをマクロで実現しているけど、slickやscalikejdbcはケースクラスと別にテーブル定義的なものが必要で、自動生成ツールがあるとはいえそもそも作らなくていいのはなんだかんだ楽。

この次にsquerylをベースにした(中身は結構変えたという話だけど)scala-activerecordが310スターで続いており、フォークして分散してしまうのは開発リソース的にもマーケティング的にももったいないなぁと思うなど。

まとめ

スター数ではslickがダントツだけど、quillとdoobieも勢いがある。でもこの3つはどれも癖が強く、汎用的に使えるとは言い難い感じ。どれを使ったらいいか判断できない場合は大人しくscalikejdbcを使っておくのが間違いなさそう。

Webフレームワークとのスターの数を比較すると、RDBScala界隈ではあまり注目を集めるトピックではないのかもしれないという気もする。でも、なんだかんだでGitHubのスターの数は外から見たときの印象や作者のモチベーションにもなるので、気に入っているライブラリがあればスターを押しておくといいと思います。

ScalaのシンプルなテスティングライブラリMinitestを使ってみる

Twitterで以下の記事を見てMonixの開発用に作られたというMinitestというテスティングライブラリの存在を知りました。

alexn.org

GitHubリポジトリはこちらです。

github.com

ScalaのテスティングライブラリというとScalaTestとSpecs2が双璧ですが、Minitestはこれらと比べると非常にシンプルなライブラリで、ScalaTestのFunSuiteからの移行がしやすいようデザインされているようです。使い方は上記の記事とGitHubのREADMEを見れば大体わかると思います。

試しに簡単なテストをMinitestで書いてみたのですが、ScalaTestのFunSuiteからであれば概ね以下のような作業で移行できそうです(FunSuiteとの互換性重視ならassertThrowsを敢えて変えなくてもよいのではという気もしますがなんで変えているのかは謎)。

  • テストケースをclassからobjectに変更し、親クラスをFunSuiteからSimpleTestSuiteに変更する
  • ScalaTestが提供する===などの比較演算子を使っている場合、通常の比較演算子に変更する
  • assertThrowsinterceptなど、一部の非互換なAPIを書き換える

assert()の第二引数にはエラー時のメッセージを指定できますが、値の比較であればassert()ではなくassertEquals()を使うと失敗したときに以下のようなメッセージを出力してくれるようなのでこちらを使ったほうがよさそうです。

- CRUD operation *** FAILED ***
  received UsersRow(1,takezoe,None) != expected UsersRow(1,takezoen,None) (SlickBlockingAPISpec.scala:33)
    minitest.api.Asserts.assertEquals(Asserts.scala:68)
    minitest.api.Asserts.assertEquals$(Asserts.scala:62)
    com.github.takezoe.slick.blocking.SlickBlockingAPISpec$.assertEquals(SlickBlockingAPISpec.scala:9)
    com.github.takezoe.slick.blocking.SlickBlockingAPISpec$.$anonfun$new$2(SlickBlockingAPISpec.scala:33)
    ...

APIはシンプルですが、Futureのアサートや、オプションでScalaCheckとの連携など、必要な機能は一通り揃っている感じです。また、Scala.jsでも使用することができます。

実際自分もScalaでテストを書くときはScalaTestでFunSuiteを使ってassert()しかしないので、Minitestのデザインはピッタリな感じがします。Specs2などはScalaの記述能力を駆使して様々な変態的な記述が可能ですが、正直機能が多すぎて覚えきれないのでこのくらいでいいんじゃないかと思いますが、assertEquals()での比較に失敗した場合のエラーメッセージなどについてはもうちょっと頑張って欲しい感があります。