ディープラーニングモデルをPythonで設定、構築、デプロイおよび維持するためのオープンソースのフレームワーク。
Instacartが成長するにつれ、我々はいくつかを困難な方法で学びました。 私たちはオープンソースのLoreを提供しています。Loreとは、機械学習をエンジニアにとって親しみやすくし、機械学習研究者にとって研究の維持を可能にするためのフレームワークです。

機械学習における共通の問題(感情):

機械学習における共通の問題(感情)

うーん、この1写真では、これがどのように動くのか分かりません…

一般的な問題

1. PythonやSQLのような高レベルでオーダーメイドコードを書くとき、パフォーマンスのボトルネックは簡単に当てはまります。

2.コードの複雑さは、貴重なモデルが多くの反復的な変更(繰り返し)の結果であるため、コードが非構造化された形で進化するにつれて、個々の洞察を維持し、コンミュニケーションを取るのが難しくなります。

3.データやライブラリの依存関係が絶え間なく変化するにつれて、再現性は低下します。

4.最新の論文、パッケージ、機能、バグに追いつこうとすると、情報が過負荷になって新たに利用可能な手段を見逃されやすくなります。特に初心者にとって余計に難しくなります。

これらの問題に対処するため、私たちはLoreの機械学習を標準化しています。 Instacartでは、3つのチームがLoreをすべての新しい機械学習開発に使用しています。現在、数多くのLoreモデルを運用中です。

TLDR

コンテキストのない予測を提供するスーパークイックデモが必要な場合は、githubからmy_appをクローンすることで大丈夫です。 フルツアーをしたい場合は、アウトラインにスキップしてください。

$ pip3 install lore $ git clone https://github.com/montanalow/my_app.git $ cd my_app  $ lore install # caching all dependencies locally takes a few minutes the first time $ lore server &  $ curl "http://localhost:5000/product_popularity.Keras/predict.json?product_name=Banana&department=produce" 

Feature Specs

この利点を理解する最善の方法は、自分のディープラーニングプロジェクトを15分で実践することです。 端末にalt-tabする前に機能仕様を見て、コードを書くことが好きな人は、ここで簡単な概要を説明します:

・モデルでは、データパイプラインを使用して推定器でのハイパーパラメータ検索をサポートしています。 彼らは、複数のGPU(利用可能な場合)を幾つかの異なる戦略で効率的に利用し、水平スケーラビリティのために保存し配布することができます。

・Keras、XGBoost、SciKit Learnなど、複数のパッケージからの推定関数がサポートされています。 それらはすべて、build、fit、またはpredictでサブクラス化され、アルゴリズムやアーキテクチャを完全にカスタマイズすることができます。

・パイプラインは、トレーンとテストセット間の情報漏えいを防ぎ、1つのパイプラインは多くの異なる推定関数での実験を可能にします。 使用可能なマシンのRAMを超えると、ディスクベースのパイプラインが使用可能になります。

・トランスフォーマーは高度なフィーチャーエンジニアリングを標準化します。 例えば、米国の国勢調査データを使用して、アメリカのファーストネームを統計し年齢または性別に変換します。 自由形式の電話番号文字列から地域コードを抽出します。 一般的な日付、時刻、文字列操作は、パンダ(pandas)で効率的にサポートされています。

・エンコーダは、推定関数に堅牢な入力を提供し、欠落した長いテール値に関する一般的な問題を回避します。 エンコーダは、garbage in/ garbage outの対応のために十分にテストされています。

・IO接続は、一般的なORM単一行操作ではなく、バルクデータのトランザクション管理と読み取り書き込みの最適化を使用して、一般的な(no)sqlデータベース用にアプリケーション全体に標準的な方法で設定およびプール(pool)されます。 モデルとデータセットを配布するための暗号化されたS3バケットに加えて、接続は設定可能なクエリキャッシュ(query cache)を共有します。

・開発中の個々のアプリケーションのDependency Managemen(依存関係管理)。本番環境に100%複製することができます。 手動のアクティベーション、またはmagic env vars、または他のすべてのためにPythonを壊す隠しファイルはありません。 venv、pyenv、pyvenv、virtualenv、virtualenvwrapper、pipenv、condaの知識は必要ありません。 誰もそれに時間を割くわけではないです。

・モデルのテストはContinuous Integration環境で実行できるため、インフチームの作業を増やすことなく、コードとトレーニングのデプロイメントを継続的に展開できます。

Workflow Support、pythonコンソール、jupyterノートブック、またはIDEのいずれのコマンドラインを好むかです。 すべての環境では、本番環境と開発環境の両方で読み取り可能なロギングとタイミングステートメントが設定されます。

15分概要

基本的なPythonの知識は、始めるために必要なすべてです。 あなたのマシン(パソコン)が学ぶことを拒否すれば、残りの1年間を複雑な機械学習の世界を探求することができます。

1.新しいアプリを作成する(3分)
2.モデルを設計する(1分)
3.足場を生成する(2分)
4.パイプラインを実装する(5分)
5.コードをテストする(1分)
6.モデルを訓練する(1分)
7.プロダクションにデプロイする(2分)

*これらの時間は、プロモーションのためのものです。 まともな機械学習の研究者は、モデルを設計するのに1分を費やすことはありません。それ以上のことはありません。あなたも15分以内に簡単にカスタムAIを構築することで、友人や同僚を驚かせることができます。

1)新しいアプリを作成する

Loreは、システムのpythonや他のプロジェクトとのコンフリクトを避けるために、各プロジェクトの依存関係を独立して管理します。 Loreを標準pipパッケージとしてインストールする:

# On Linux
$ pip install lore
# On OS X use homebrew python 2 or 3
$ brew install python3 && pip3 install lore

環境を再現できないときに他人の仕事を再現することは難しいです。 Loreは、システムのPythonを、あなたのOSがそれが好きなやり方で、暗黙(謎めいた)の依存関係エラーやプロジェクトの競合を防ぐために保存しています。 各Loreアプリは独自のpythonインストールとruntime.txtとrequirements.txtの指定されたバージョンにロックする必要のある依存関係のみを持つ独自のディレクトリを取得します。 これによりLoreアプリを効率的に共有できるようになり、機械学習プロジェクトのための簡単な再現性に一歩近づきます。

Loreをインストールすると、読み込み中にディープラーニングプロジェクトのための新しいアプリを作成できます。 Loreはデフォルトではモジュール化されており、スリムなので、このプロジェクトのディープラーニング依存関係をインストールするには–kerasを指定する必要があります。

$ lore init my_app --python-version=3.6.4 --keras

2)モデルの設計

このデモでは、Instacartのウェブサイト上で、その名前と部門に基づいて製品がどれほど普及するかを予測するモデルを構築します。世界中の製造業者は、さまざまなフォーカスグループで製品名をテストし、 魅力を最大限引き出すために店舗に配置。 私たちのシンプルなAIは同じサービスを提供し、小売業者やメーカーは新しい市場でのマーチャンダイジングをよりよく理解することができます。

 

名前って何? 私たちがバナナと呼ぶもの。

他の名前では甘いにおいがするもの。

機械学習の最も難しい部分の1つは、良いデータを取得することです。 幸いにInstacartは300万の匿名化された食料品の注文を発表しました。 次に、製品名と部門という2つの機能に基づいて年間売上を予測するsupervised learning regression modelに質問を組み立てることができます。

私たちが構築するモデルは、説明のためだけのものであり、実際にはそれはうんざりしています。 私たちは好奇心の強い読者のためのエクササイズとして良いモデルを構築しています。

3)足場を生成する

$ cd my_app $ lore generate scaffold product_popularity --keras --regression --holdoutすべての知識モデルは、データをロードしてエンコードするパイプラインと、特定の機械学習アルゴリズムを実装する推定関数で構成されています。 モデルの興味深い部分は、生成されたクラスの実装の詳細です。

すべての知識モデルは、データをロードしてエンコードするパイプラインと、特定の機械学習アルゴリズムを実装する推定関数で構成されています。 モデルの興味深い部分は、生成されたクラスの実装の詳細です。

パイプラインは、左側の生データ(raw data)から始まり、右側の目的のフォームにエンコードします。 次いで、推定関数は、符号化されたデータでトレーンされ、早期に検証セットに停止し、試験セットで評価される。 すべてをモデルストアにシリアル化し、1つのライナーでデプロイするために再度ロードすることができます。

足場を生成する

モデルのライフサイクル解剖図

4)パイプラインを実装する

機械学習アルゴリズムに適した生データを手渡すことはまれです。 通常、データベースからロードしたり、CSVをダウンロードしたり、アルゴリズム用に適切にエンコードしたり、トレーニングセットとテストセットに分割します。 lore.pipelinesの基本クラスは、標準的なワークフローでこのロジックをカプセル化します。

lore.pipelines.holdout.Baseは、データをトレーニング、検証、テストセットに分割し、マシンラーニングアルゴリズムのデータをエンコードします。 私たちのサブクラスは、get_data、get_encoders、get_output_encoderの3つのメソッドを定義します。

Instacartの公開データは、データベーステーブルなどの複数のcsvファイルに分散されています。

order_id  product_id  add_to_cart_order   reordered
2           33120               1              1
2           28985               2              1
2           9327                3              0
2           45918               4              1
2           30035               5              0
department_id          department
1                        frozen
2                        other
3                        bakery
4                        produce
5                        alcohol
product_id   product_name                         aisle_id     department_id
1            Chocolate Sandwich Cookies              61             19
2            All-Seasons Salt                        104            13    
3            Robust Golden Unsweetened Oolong Tea    94             7
4            Smart Ones Classic Favorites 
             Mini Rigatoni With Vodka Cream Sauce    38             1
5            Green Chile Anytime Sauce                5             13

私たちのパイプラインのget_dataはraw Instacartデータをダウンロードし、pandasを使って機能(product_name、department)とレスポンス(sales)をDataFrameに結合します。 このような:

product_name                       department                  sales
0,Chile Con Queso                     deli                     109.0
1,Sushi Chef Panko Bread Flakes     international              78.0
2,Premium Solid White Albacore      canned goods               596.0
  Tuna in Water
3,Organic Cauliflower               produce                    12936.0
4,Culinary Collection Monterey      frozen                     14.0
Jack Jalapeno Stuffed Pretzels
5,Cheese Spread Almond Swiss        dairy eggs                 18.0
6,TruMoo 1% Lowfat Milk Chocolate   dairy eggs                 550.0
7,Spearmint Sugarfree Gum 3 Pk      snacks                     40.0
8,Bicolor Sweet Corn                produce                    9764.0
9,Bleach Clean Linen Concentrated   household                  45.0
10,Chardonnay Y Block Santa Barbara alcohol                    6.0
11,Canine Cuisine with Lamb         pets                       19.0
   in Meaty Juices
12,Cocoa Radiant Body Gel Oil       personal care              6.0
13,Strong Dark Chocolate            snacks                     17.0
14,Glide Original Floss             personal care              56.0
15,White Select A Size Paper Towels household                  64.0
16,Twinkies Cakes                   snacks                     30.0

get_dataの実装を次に示します。

# my_app/pipelines/product_popularity.py part 1

import os

from lore.encoders import Token, Unique, Norm
import lore.io
import lore.pipelines.holdout
import lore.env

import pandas

class Holdout(lore.pipelines.holdout.Base):
# You can inspect the source data csv's yourself from the command line with:
# $ wget https://s3.amazonaws.com/instacart-datasets/instacart_online_grocery_shopping_2017_05_01.tar.gz
# $ tar -xzvf instacart_online_grocery_shopping_2017_05_01.tar.gz

def get_data(self):
url = 'https://s3.amazonaws.com/instacart-datasets/instacart_online_grocery_shopping_2017_05_01.tar.gz'

# Lore will extract and cache files in lore.env.DATA_DIR by default
lore.io.download(url, cache=True, extract=True)

# Defined to DRY up paths to 3rd party file hierarchy
def read_csv(name):
path = os.path.join(
lore.env.DATA_DIR,
'instacart_2017_05_01',
name + '.csv')
return pandas.read_csv(path, encoding='utf8')

# Published order data was split into irrelevant prior/train
# sets, so we will combine them to re-purpose all the data.
orders = read_csv('order_products__prior')
orders = orders.append(read_csv('order_products__train'))

# count how many times each product_id was ordered
data = orders.groupby('product_id').size().to_frame('sales')

# add product names and department ids to ordered product ids
products = read_csv('products').set_index('product_id')
data = data.join(products)

# add department names to the department ids
departments = read_csv('departments').set_index('department_id')
data = data.set_index('department_id').join(departments)

# Only return the columns we need for training
data = data.reset_index()
return data[['product_name', 'department', 'sales']]

次に、列ごとにエンコーダーを指定する必要があります。 コンピュータ科学者は、効果的な機械学習のために、エンコーダをタイプ注釈(type annotation)の一種と考えるかもしれません。 いくつかのプロダクトは名前が読みづらいので、最初の15単語まで切り捨てます。

# my_app/pipelines/product_popularity.py part 2

    def get_encoders(self):
        return (
            # An encoder to tokenize product names into max 15 tokens that
            # occur in the corpus at least 10 times. We also want the 
            # estimator to spend 5x as many resources on name vs department
            # since there are so many more words in english than there are
            # grocery store departments.
            Token('product_name', sequence_length=15, minimum_occurrences=10, embed_scale=5),
            # An encoder to translate department names into unique
            # identifiers that occur at least 50 times
            Unique('department', minimum_occurrences=50)
        )

    def get_output_encoder(self):
        # Sales is floating point which we could Pass encode directly to the
        # estimator, but Norm will bring it to small values around 0,
        # which are more amenable to deep learning.
        return Norm('sales')

それがパイプライン用のものです。 私たちの最初の推定関数は、lore.estimators.keras.Regressionのシンプルなサブクラスであり、クラシック(典型的)なディープラーニングアーキテクチャを適切なデフォルトで実装します。

# my_app/estimators/product_popularity.py

import lore.estimators.keras


class Keras(lore.estimators.keras.Regression):
    pass

最後に、私たちのモデルは、ディープラーニングアーキテクチャーの高いレベルの特性を、推定関数にデリゲートして指定し、私たちが構築したパイプラインからそのデータを引き出します。

# my_app/models/product_popularity.py

import lore.models.keras

import my_app.pipelines.product_popularity
import my_app.estimators.product_popularity


class Keras(lore.models.keras.Base):
    def __init__(self, pipeline=None, estimator=None):
        super(Keras, self).__init__(
            my_app.pipelines.product_popularity.Holdout(),
            my_app.estimators.product_popularity.Keras(
                hidden_layers=2,
                embed_size=4,
                hidden_width=256,
                batch_size=1024,
                sequence_embedding='lstm',
            )
        )

5)コードをテストする


あなたが足場を生成したときに、このモデルのためにスモークテストが自動的に作成されました。 最初の実行には、テストのために200MBのデータセットをダウンロードするのに時間がかかるでしょう。 ./tests/dataにキャッシュされているファイルをトリムし、それらのファイルをリポジトリにチェックインしてネットワークの依存関係を取り除き、テストを高速化することをお勧めします。

$ lore test tests.unit.test_product_popularity

6) Train the model(モデルをトレーニングする)

モデルをトレーニングするとデータが./dataにキャッシュされ、./modelsにアーチファクトが保存されます

$ lore fit my_app.models.product_popularity.Keras --test --score

Loreが時間を費やしている(動作する)様子を見るには、2番目の端末のログに従ってください。

$ tail -f logs/development.log

隠れたレイヤーを追加して、モデルのscoreに役立つかどうかを確認してください。 モデルファイルを編集したり、コマンドラインから適切にプロパティを渡したりすることができます。 –hidden_layers = 5です。 キャッシュされたデータセットでは約30秒かかります。

 Train the model(モデルをトレーニングする)

 

モデルの機能を検査する

あなたはlore環境でjupyterのノートを実行することができます。 Loreはlore notebookとlore consoleの両方のアプリケーションの仮想環境を参照するカスタムjupyterカーネルをインストールします。

$ lore notebook

notebooks / product_popularity / features.ipynbをブラウズし、「すべて実行」をクリックすると、モデルの最後のフィッティングのビジュアライゼーションが表示されます。

モデルの機能を検査する

“生産”部門は “20”にコード化されています、その数(食料品)が多いです。

モデルの予測(青)が特定のフィーチャのために集計されたときのテストセット(金)をどれくらいうまく追跡しているかを知ることができます。 このケースでは、モデルが異常値(外れ値)のどれくらいを完全には説明していない「生産」を除いて、かなり良いオーバーラップを持つ21の部門があります。

あなたは、ノートブック/ product_popularity / architecture.ipynbでノートブックを動かすことによって生成されたディープラーニングアーキテクチャも知ることができます。

残念ながら、メディアはsvgをサポートしていないので、これは判読できませんが、ノートブックは(できます)

名前のトークン化された部分が左側のLSTMを通って実行され、部門名が右側の埋め込みに供給され、両方とも隠れたレイヤーを通過します。

あなたのモデルを提供する

Loreアプリは、モデルへのHTTP APIとしてローカルで実行できます。 デフォルトでは、モデルはHTTP GETエンドポイントを介して predictメソッドを公開します。

$ lore server &
$ curl "http://localhost:5000/product_popularity.Keras/predict.json?product_name=Banana&department=produce"
$ curl "http://localhost:5000/product_popularity.Keras/predict.json?product_name=Organic%20Banana&department=produce"
$ curl "http://localhost:5000/product_popularity.Keras/predict.json?product_name=Green%20Banana&department=produce"
$ curl "http://localhost:5000/product_popularity.Keras/predict.json?product_name=Brown%20Banana&department=produce"

私の結果は、「Organic」を「Banana」に加えると、「生産」部門の2倍以上の果物を売ることになります。 「グリーンバナナ」は「ブラウンバナナ」よりも(売り上げ)は悪化すると予測されています。本当に売り上げを上げたいなら – それを待って – Organic Yellow Bananaは効くかもしれません。

7)本番環境にデプロイする

Loreアプリケーションは、Heroku Buildpacks(ビルドパック)をサポートするインフを通じてデプロイできます。 Buildpacksは、デプロイメント用のコンテナにruntime.txtとrequirements.txtの仕様をインストールします。 クラウドで水平方向のスケーラビリティが必要な場合は、Herokuのスタートガイドに従うことができます。

./models/my_app.models.product_popularity/Keras/でlore fitコマンドを発行するたびに結果が表示されます。 このディレクトリと./data/は、デフォルトでは.gitignoreにあります。これは、コードが常にそれらを再作成できるためです。デプロイメント(導入)の簡単な戦略は、公開するモデルバージョンをチェックインすることです。

$ git init .
$ git add .
$ git add -f models/my_app.models.product_popularity/Keras/1 # or your preferred fitting number to deploy
$ git commit -m "My first lore app!"

Herokuは簡単にアプリを公開できます。 スタートガイドをチェックしてください

`Getting Started on Heroku with Python | Heroku Dev Center
A step-by-step guide for deploying your first Python app and mastering the basics of Herokudevcenter.heroku.com

こちらはTLDRです:

$ heroku login
$ heroku create
$ heroku config:set LORE_PROJECT=my_app
$ heroku config:set LORE_ENV=production
$ git push heroku master
$ heroku open

$ curl “`heroku info -s | grep web_url | cut -d= -f2`product_popularity.Keras/predict.json?product_name=Banana&department=produce”

これで、http:// localhost:5000 /をあなたのherokuアプリ名に置き換えて、どこからでもあなたの予測にアクセスできます!

*または、ここでmy heroku app hereとやり取りすることができます。

次のステップ

0.5リリースはコミュニティを1.0に構築するための強力な基盤であると考えています。 パッチリリースでは変更が破られることはありませんが、マイナーバージョンではコミュニティのニーズに応じて機能が変更される可能性があります。 既存のアプリの明確なアップグレードパスを維持するために、非推奨と警告を出します。

1.0より前に追加したい機能がいくつかあります:

•モデル/エスティメータ/フィーチャ分析のためのビジュアライゼーションによるWeb UI

•モデルトレーニングおよびデータ処理中の分散コンピューティングサポートの統合、ジョブキューイング壊れたコードだけでなく、悪いデータやアーキテクチャのテスト

•その他のドキュメント、エスティメータ、エンコーダ、トランス

•フルWindowsサポート

Loreを機械学習に役立てるにはどうすればいいですか?

Thank you to Jeremy Stanley, Emmanuel Turlay and Shrikar Archak for contributing to the code.(コードへの貢献に対する感謝)

タイトル:How to build a deep learning model in 15 minutes

作者:Montana Low

原文URL:https://tech.instacart.com/how-to-build-a-deep-learning-model-in-15-minutes-a3684c6f71e

今すぐシェアしよう!
今すぐシェアしよう!