Mercari Engineering Blog

We're the software engineers behind Mercari. Check out our blog to see the tech that powers our marketplace.

メルカリの今年1年間の機械学習の取り組みとこれから

これはMercari Advent Calendar 2017 の2日目の記事です。 昨日は @stanaka分散ファイルシステムはブロックチェーンの夢を見るか でした。

今回は@Hmj_kd が、メルカリの機械学習の取り組みや機械学習エンジニアの今年行ってきた活動のいくつかをご紹介したいと思います。 以下、一部にて機械学習をMLと略します。

この1年間で機械学習で取り組んだこと

私が入社したのは2017/01で、社内では二人目の機械学習エンジニアでした。 その当時は

speakerdeck.com

にあるように、プロダクトにMLに関するものはありませんでした。

現在は、チーム全体でマネージャも含めて約10人ほどの組織になり、活発に実験や開発が行われています。

続きを読む

分散ファイルシステムはブロックチェーンの夢を見るか

今年からメルカリでもMercari Advent Calendar 2017と称してAdvent Calendarを始めることとなりました。 初日は id:stanaka / @stanaka がロンドンよりお届けします。

分散ファイルシステムという言葉を聞くと、トラウマを刺激され、うっと頭を抱える人も多いかと思います。私もその一人で、以前にPBクラスまではいかずとも数TBのHDDを数百台並べたシステムのお守りをしたことがあり、日々壊れ続けるHDDに負荷に悲鳴を上げるメタデータDBなどネタには困らない状況でした。そういう時にAWS S3を触ると、「ああ、これは天国だ..」ともはや過去には戻れない思いをしたものです。

最近では分散ファイルシステムを運用しているところもめっきり減っていて*1もう過去の分野かな、と思っていたのですが、ここ数年で「ブロックチェーン x 分散ファイルシステム」という文脈でいくつか面白いプロジェクトが出てきつつあります。

個人的にもブロックチェーンまわりの技術に注目しており、その一環でいろいろ調査しましたので、ざっと最近の動向を紹介したいと思います。

ちなみに「ブロックチェーン x 分散ファイルシステム」という文脈には、ブロックチェーン上でストレージを使い易くしたいという流れと、分散ファイルシステムに参加するインセンティブとしてブロックチェーンで実装された仮想通貨を利用したいという2つの流れがあります。

ストレージとしてのブロックチェーン

ブロックチェーンの特徴は、データの改竄が困難で、耐障害性の高い分散台帳を実現していることです。ブロックチェーン上には、チェーンのように取引情報がメッセージとしてブロック単位で蓄積されていき、全てのデータが誰でも見れるようになっています(匿名性を意識したブロックチェーン実装もありますが)。

ブロックチェーン実装の一つであるEthereumでは、取引情報(メッセージ)だけではなく、スマートコントラクトと呼ばれるロジックを載せて実行させ、またデータを保存することもできます。Ethereumのブロックチェーンでは、全てのデータが誰でも参照できるパブリックな状態となっています。そのため、個人情報のような秘匿することが必要なデータは暗号化してから保存する必要があり、その復号はブロックチェーンの外で行ないます。

ただデータは保存できても、そのバイトあたりのコストが相当に高く、画像のような大きなサイズのデータや、ちょっと文章程度の大きさのデータを載せるだけでもためらわれる金額となります。半年ほど前の試算で、32バイトの本に0.177USD、1MBの保存となると5531USDほど必要となっています。これは、ちょっと高級すぎるストレージですね。

ブロックチェーン上で本格的なアプリケーションを動かすには、ストレージが不可欠なのですが、この価格では現実的とは言えません。これを解消するために分散ファイルシステムをブロックチェーンと関連づけるプロジェクトが出てきています。

分散ファイルシステムとそのインセンティブ

分散ファイルシステムはこれまでにさまざまな実装が開発されてきました。一般ユーザー向けのものとしては2000年代初頭のWinnyや最近でも使われているBitTorrentあたりは有名です。この2つは分散ファイルシステムというよりは、分散配信システムといったほうが正確かもしれませんが。また企業内で利用する前提の実装もオープンソースのものからプロプラエタリのものまで多数あります。

ただこれらの分散ファイルシステムを自分達で運用することは非常に大きなコストがかかるため、そのコストを回収し十分に正当化できるほど意味のあるアプリケーション・サービスを動かすことは難しくなりつつあります。分散ファイルシステムそのものをサービスとして提供することでコストを回収するのは、今ではスケールメリットを生かし低料金で提供できる一部の大規模クラウド事業者のみとなっています。

そのため現在では、自力で運用を頑張るよりは、AWS S3のようなクラウドサービスを利用する方が圧倒的に省力で、一般的となっています。ただ、クラウドサービスを利用している場合、その管理者のミスや意向でアクセス不能になる、データが漏洩する、サービス利用料がコントロールできない、といった集中管理されていることによるリスク・デメリットがあります。

ところがここ数年で、ストレージサービスを提供するために、広く様々なユーザーにストレージを融通してもらい、その見返り(インセンティブ)として、ブロックチェーン上の仮想通貨を支払う分散ファイルシステムのプロジェクトがいくつか登場しています。

ブロックチェーン x 分散ファイルシステム

では、具体的にいくつかプロジェクトを見ていきましょう。

Filecoin*2

filecoin.io

Filecoinは、ブロックチェーン系分散ファイルシステムの本命と言えるでしょう。今年の9月にICOを行ない、2億USD以上の資金を集めることに成功しました。現在は絶賛開発中となっており、リリースへの期待が高まっています。

ファイルシステム自体はIPFSというP2P分散ファイルシステムを利用し、その上にブロックチェーンによる仮想通貨(filecoin)システムを構築し、ストレージを提供する各ノードへのインセンティブとして発行します。各ユーザは、Filecoinのネットワークにストレージを提供することで報酬が得られます。

IPFS

ipfs.io

IPFS (InterPlanetary File System) はP2P分散ファイルシステムです。 WWWと同様にファイルを配置し、パブリックに誰でもアクセスできるようにすることができます。また、IPNS(Inter-Planetary Naming System)という仕組みにより名前解決することもできます。

Filecoinのブロックチェーン

BitcoinやEthereumなどのブロックチェーンでは、ネットワークを維持するための処理として、Proof of Work と呼ばれる計算が利用されており、計算に成功することで仮想通貨が与えらえるというインセンティブ設計がなされています。これを一般にマイニングと呼びます。

Filecoinでは、これの処理を Proof of Storage という手法を採用しています。 Proof of Storageは、あるノードがデータを正しく保持していることを検証する処理のことで、ホワイトペーパーでは、その具体的な計算方法として Proof of Replication と Proof of Spacetime の2つが提案されています。

  • Proof of Replication .. 各ノードが保持しているべきデータの一部と与えられたチャレンジ値から生成される「証明」(ハッシュ値のようなもの)を提供し、それをデータのオーナーが検証します。
  • Proof of Spacetime .. Proof of Replicationを指定回数繰り返すことで、一定期間データを保持していることを証明できるようにしています。

またユーザーが支払うコストと、ノードが得られる報酬は市場を導入して調整しています。市場には、データを保存する Storage Market とデータを取得する Retrieval Market の二種類があり、ユーザーとノードがそれぞれ入札を行い、市場原理を働かせて価格を決定します。

Storj*3

storj.io

StorjはEthereumを利用して構築された分散ファイルシステムで、一般から利用できるストレージサービスとして既に稼動しています。

Storjはネットワーク自体は誰でも参加できますが、ユーザー観点では、APIのエンドポイントやアカウント・課金システムはStorjによって集中管理されています。そのため、完全に分散されたシステムとは言えないのですが、代わりに固定化され分かりやすい価格体系やSLAの保証が提供されています。

Storjの価格体系は$0.015/GB/Monthと、AWS S3(US East)の$0.023/GB/Monthよりも安くなっています。またDropboxの有料プランが1TBで$9.99/Monthですので、平均666GBを越えなければ、Storjのほうが安くなります(もっともクライアントアプリの使い勝手はDropboxにはまったく及びませんが..)。また最初の1年は25GBが無料となっており、戦略的な値段設定となっています。

またStorjにストレージを提供し、報酬を得ることもできます。今年10月の最近の試算によると100GBで1.50 USD/月程度とのことです。 手元のQNAPの空き容量を提供したり、Raspberry Piでファイルサーバーを構築するなどで気軽に参加できそうです。Bitcoinのマイニングはもう個人でできる範囲を越えていますが、Storjのマイニングであれば、個人での参加もまだまだ現実的に考えられそうです。

分散ファイルシステムとしては、ユーザーからアップロードされたファイルは複数のノードに分割された上で冗長化されて配置されます。Storjのように誰でも参加できる分散ファイルシステムの信頼性における大きな課題として、いかにファイルがネットワーク上から消えないようにするか、という問題があります。

この問題に対処するために、Storjの実装では一つのファイルを細かいチャンクに分割した上で、バーコードやQRコードでも利用されている誤り訂正方式のリード・ソロモン符号を利用して、40のshardに分散して配置します。これにより、半数の20個のshardが失われない限りはファイルが復元可能としています。ネットワークのノード数が十分増え、各shardが正しく分散配置されていれば、短かい時間の間に20ものshardが偶然失なわれるようなことが起きる確率は極めて低く抑えることができます。(もっとも、利用規約では、実際に発生しても免責となるように予防線は張っていますが。)

Storjでのマイニングに相当する処理として、FilecoinのProof of Replicationと似たロジックのProofs of Retrievability を利用し、ファイルの存在確認を行なっています。どれほどの容量を提供するとどの程度Storjコインが支払われるかはホワイトペーパーには記載されておらず、具体的な計算式は公開されていないようです。

Swarm*4

swarm-gateways.net

SwarmはEthereum公式の分散ファイルシステムです。Ethereumはブロックチェーン上にロジックを載せるようにしたスマートコントラクトで知られていますが、そのエコシステムは、スマートコントラクトだけではなく、ストレージのSwarm、メッセージングのWhisperの3つから構成されます。

Swarmの実装は現在 Proof of Concept のものが稼動しており、その上に載せられている公式ページは、HTTPゲートウェイ経由でアクセスすることができます。

Swarmのノードへのインセンティブは、Bandwidth incentiveとStorage incentiveの2つに分けられており、Filecoinなどとは異なり、Swarmでは前者に重きが置かれています。

またEthereumのSmart contractの実装であるEVMやSolidityと深く結合することで、Smart contractを利用したDApp(分散されたアプリケーション)から利用されやすくなります。(現在、ロードマップにあるように絶賛開発中のため詳細はこれから、というところですが。)

ブロックチェーンによる分散ファイルシステムへの市場原理の導入

現在、大規模なストレージサービスは、Dropboxのようなユーザー向けのもの、AWS S3のような開発向けのものなど各種ありますが、いずれも特定の管理者が全権を握る中央集権的なモデルによるものです。このモデルでは、ざっくり言って、利用料からインフラ構築・維持管理コストを引いたものが利益となりますが、それをAWS S3ではAmazonが独占しているわけです。

ブロックチェーン x 分散ファイルシステムの面白いところは、ストレージを用意するインセンティブとして、ブロックチェーンによる仮想通貨が導入されているところです。たとえば、今回紹介したStorjなどでは自宅のNASの空いている領域を提供して稼ぐということもできるようになっています。Bitcoinもマイニングのインセンティブ設計がうまく機能して盛り上がっているところがあると思いますが、ユーザーが広く参加できる地球規模も分散ファイルシステムがうまく機能すると、これは相当に面白いことになると思います。

月額固定で容量無制限のストレージサービスが、結局、サービスを維持できずに終了になるということがこれまでにも何回かありましたが、ブロックチェーン x 分散ファイルシステムによるサービスではこのような事態を避けられることが期待されます。もちろんサービスに参加する人が減っていき、徐々に使えなくなる、容量・帯域が不足するということはあり得ますが、一定数の参加者を確保でき市場原理が機能していれば、すくなくとも突然一方的にサービス終了が宣言される、ということは原理的にありえません。

またそのサービスを利用するための費用もインセンティブ設計がうまく機能すれば、そのインセンティブを求めて多数のユーザーがファイルストレージを提供するようになり、市場原理が健全に働き、極めてリーズナブルな価格でサービスを利用し続けられることが期待できます。

もっとも、前提条件となる、安定した分散ファイルシステムが実装し、健全なインセンティブ設計を構築する、ということはかなりの大きな課題と言えます。例えば、インセンティブについては、Bitcoinの場合は difficulty というパラメータ一つでマイナーごとのバランスを調節しているのですが、分散ストレージの場合、必要な容量は実需次第というところもあり、インセンティブ設計の調整が一段難しくなっていると思います。

おわりに

コンピューターの歴史上では、分散と集中のトレンドが交互に表われると良く言われますが、AWSの登場とともにコンピューティングパワーの大企業への集約が加速しています。ブロックチェーン x 分散ファイルストレージのような分散型のアーキテクチャが注目を浴び始めているのは、再び集中から分散への揺り戻しが始まったとも考えられ、非常に面白い動きだと思います。

メルカリではブロックチェーン関連の開発を検討しており、ブロックチェーンそのものから、分散ファイルストレージのような応用、その上のアプリケーションまで、様々なレイヤーに興味のあるエンジニアを募集しています。

2日目の明日は、@Hmj_kd です。引き続きどうぞ!

主要データベースの増え続けるdisk容量の対応事例

こんにちは、SRE の @masartzです。
今回は最近取り組んだ、メルカリの主要データベースの容量削減のお話をしようと思います。

TL;DR

主要データベースの容量を20%以上削減しました

どういう状況だったか? 何をしたか?

メルカリでは2017年11月現在、出品数は1日100万件を超えています。 なので、単純に日々多くのデータが増えていっています。 そのためデータベースのスケーリングは常に検討し、取り組まなければならない課題です。
今回扱ったデータベースはいくつかあるデータベースの中で商品テーブルを持つ、メルカリの主要データベースになります。 増え続けるデータに対応するための、テーブル分割を変則的な形で対応したのでその過程を紹介します。

続きを読む

オートマトンを活用したiOS版メルカリ アッテの会員登録画面

今日は、iOSエンジニアの@orakaroです。

iOSエンジニアの皆さん、iPhone Xの対応はいかがでしょうか? メルカリアッテはようやくSwift4/RxSwift4/iPhone Xの対応が落ち着いたところです。

このブログでは、10月11日に開催した Souzoh iOS Talkの中で発表した メルカリ アッテを支えるオートマトンについて、より詳細な内容をお伝えします。

当日のスライドは下記になります。

speakerdeck.com

続きを読む

メルカリのQAエンジニアがテスト自動化に挑んだ話

はじめまして!QAエンジニアのkinoshです。

みなさんは「自動化」と聞いて、どんな期待をしますか?
生産性アップ?高い品質?スピード?いろいろな期待があると思います。
現在メルカリQAでは、繰り返し行われる部分や、機械のほうが得意な部分をどんどん自動化して、節約できた時間を、人間しか見つけられない作業(不具合を探索したり、仕様からリスクを洗い出したり)に使っていこうと日々奮闘中です。
この記事では、最近私が主導で進めたテスト自動化について、自身が学んだ知見などを共有いたします。

続きを読む