機械学習開発の分野では、全体像を見て細かい詳細をすべて取り除くと、機械学習開発における不変の 2 つのステップ、つまりモデルのトレーニングと予測 (または推論) を抽出できます。現在、機械学習に最適な言語は Python です (作業環境に特別な制約がない限り)。この記事では、新たな旅へとご案内します。最後まで読んでいただければ、Rust をトレーニング バックエンドおよびデプロイメント プラットフォームとして使用するというアイデアは、思ったほど突飛でも混乱を招くものでもないことがおわかりいただけると思います (タイトルで述べたパフォーマンスの向上以外にも、このアプローチには多くの利点があります)。
なぜ Python なのか? 機械学習開発で使用されるさまざまなワークフローについて議論するには多くの時間を費やす必要がありますが、通常は探索的な方法でモデルをトレーニングすると言っても、一般的に議論の余地はありません。データの集合を取得し、それを細かく分割して理解を深め、関心のある特定の問題を解決するためにさまざまなアプローチを試します。 (Google ストリートビューの画像に写っている子猫を認識しますか? 天気予報を予測しますか? 作物の収穫量を最適化しますか? あなたにお任せします!) 途中には多くの落とし穴があり、最終的に使用しようとするテクノロジーのほとんどはそのままでは機能しないため、迅速なプロトタイピングと反復的な改善に重点が置かれます。 Python のような動的プログラミング言語の場合、これは理想的な使用例です。 さらに重要なのは、機械学習の実践者のほとんどは統計学、数学、物理学、または同様の学位のバックグラウンドを持っていますが、コンピューターサイエンスの専門家ではないため、彼ら(私もそうです✋)はソフトウェアエンジニアリングの実践とツールに関するトレーニングをほとんど受けていないことを考慮する必要があります。 Python は関数型パラダイムとオブジェクト指向パラダイムの両方をサポートしていますが、命令型スタイルを使用すると、スクリプト機能をすぐに使い始めることができます。 Python は入門障壁が低く、経験を積んで習熟するにつれて、あなたとともに成長していきます。 しかし、使いやすさだけでは十分ではありません。機械学習モデルのトレーニングには多くの負荷がかかり、Python は間違いなく最速のプログラミング言語ではありません。 そこで、NumPy (1995/2006)、SciPy (2001)、Pandas (2008)、Scikit-learn (2007) が次々と市場に登場しました。機械学習と科学計算のための高品質で包括的なツールキットがなければ、Python は今日のような地位にはなかったでしょう。 ただし、内部を見てみると、そこには Python はあまりありません。Python を使用して、C および C++ ルーチンの強力なカーネルを調整および活用しています。 Python はこれらのシステムのフロントエンドであり、ユーザーは Python をユーザー インターフェイスとして使用して、システムを簡単に結合します。 C と C++ はバックエンドであり、舞台裏の魔法です。
実際、これは Python の見落とされがちな機能です。Foreign Function Interface (FFI) を使用すると、他のプログラミング言語と相互運用するのがかなり簡単になります。特に、Python ライブラリは、大量の数値計算を必要とするコードを C および C++ に委任できます。これは、Python 科学エコシステムのすべての基本ライブラリで使用される戦略です。 もちろん、テクノロジーですべてを決定することはできません。たとえ一部の人にとって受け入れがたいものであったとしても、社会学的要因はほとんどのプロジェクトの成功(または失敗)にとって極めて重要です。 そこで、いくつかの背景情報を追加する必要があります。Python はオープンソース プロジェクト (MATLAB など) であり、学術機関への浸透度は無視できないものであり、実際、ディープラーニングが脚光を浴びたとき、それに関連する科学的エコシステムの大部分はすでに確立されていました。 振り返ってみると、Python が機械学習の分野を支配する有力な候補であると考えるのは当然であり、驚くことではありません。 今後も Python を使い続けるべきでしょうか? 先ほど、機械学習開発に最適なプログラミング言語として Python が選ばれる理由のいくつかについて簡単に触れました。 しかし、世界は止まってはいません。状況の変化によって、どのツールが「仕事に最適なツール」であるかという認識が大きく変わる可能性があります。 最近のいくつかの傾向により、機械学習の分野における Python の地位が強化される可能性があります。 マイクロサービス 現在、マイクロサービス アーキテクチャはアーキテクチャ設計アプローチの主流となっています。つまり、企業はネットワークを介して相互に通信するコンテナ化されたサービスの緩やかな集合としてビジネスを運営しています。 Polyglot スタックの実行はこれまでになく簡単になりました。メイン アプリケーションとビジネス ロジックの本質を Java で記述できます。機械学習を使用してクレジットカード取引が正当か不正かを判断する場合は、Python マイクロサービスに POST リクエストを送信できます。 データ サイエンティストや機械学習エンジニアが Python でモデル探索を行っていた時代は終わり、現在ではすべてを「プロダクション チーム」に引き渡し、会社が選択した言語でロジックを完全に書き直しています。 デブオプス 自分で作って、自分で運用する — Werner Vogels (Amazon CTO) ここではビジネスについて話しているので、機械学習モデルは真空中に存在するのではなく、企業が立ち上げ、最適化、改善したい製品やプロセスの一部であることを強調することが重要です。 したがって、データ サイエンティストのチームだけで大きな成果を達成できると考えるのは単純すぎます。それ以上のものが必要です。 成功のチャンスを得るには、製品からソフトウェア エンジニアリングまでのさまざまなスキルを組み合わせる必要があります。 では、そのようなチームはどのプログラミング言語を使用すべきでしょうか? JavaScript の台頭を思い出してください。JavaScript と NodeJS を使用すると、同じ人がシステムのフロントエンドとバックエンドの両方を処理できるようになりました (「フルスタック」)。 汎用プログラミング言語である Python も同様の利便性を提供します。機械学習開発に科学的スタックを使用したり、モデルの展開にフレームワーク (Django、Flask、FastAPI など) を活用したり、REST または gRPC API を通じて予測を提供したりできます。 それは素晴らしいことですよね? 連鎖反応 Python には大規模な機械学習エコシステムがあります。 機械学習アルゴリズムまたは機械学習フレームワークを採用してもらいたいので、Python で記述します (または FFI を使用して Python バインディングを提供します)。 Python エコシステムがさらに強化されました。 このサイクルを繰り返します。 答え 明日も私たちは Python で機械学習ソフトウェアを書いているかもしれません。 永遠に使うのでしょうか?それはあり得ないことです。それは、10年後のコンピュータ業界の将来がどうなるかを自問するようなものです。 しかし、今後 5 年以内に Python が消滅するとは考えられません。 だから何?この記事は Rust に関するものではないのですか? それは正しい! しかし、もっと重要なのは、仕事に取り掛かる前に、起こりうる誤解を解消することです。 私は、機械学習の言語として Rust が Python に取って代わるとは思っていません。そのようなことが起こる兆候はまったくなく、現在も将来もトレンドではありません。 これら 2 つの言語は同じユーザー層を対象としているわけではなく、異なる制約を対象とし、異なる最適化を行い、異なる一連の問題を解決します。 しかし、Rust は機械学習の世界で独自の地位を確立しています。 Rust は、機械学習ワークロードの優先 Python バックエンドとして C および C++ に取って代わる大きな可能性を秘めています。 なぜ Rust なのか? この本の序文以上に良い答えはありません。 たとえば、「システム レベル」は、メモリ管理、データ表現、同時実行性の低レベルの詳細を処理します。伝統的に、このプログラミング分野は、その悪名高い落とし穴を避けるために十分な時間をかけて勉強した選ばれた少数の人だけがアクセスできる神秘的な領域と見なされてきました。それを実践する人であっても、コードが脆弱になったり、クラッシュしたり、破損したりしないように注意する必要があります。 Rust は、これらの古い落とし穴を排除し、それらの障壁を突破するのに役立つ、使いやすくエレガントなツールのセットを提供します。より低レベルの制御に「ドリルダウン」する必要があるプログラマーは、クラッシュやセキュリティの脆弱性といった通常のリスクを冒したり、不安定なツールチェーンの細かい点を探ったりすることなく、Rust を使用してそれを実行できます。さらに優れているのは、この言語が、パフォーマンスとメモリ使用量に優れた堅牢なコードに自然に導くように設計されていることです。 Rust は、競合製品をはるかに上回る信頼性レベルで、C や C++ に匹敵するパフォーマンスを提供します。 自分が知らないことをコンパイラが知っていると信頼します。言い換えれば、「これは一体何だ?」から「このコードを本番環境で実行してみましょう!」へと安全に移行したことになります。 これにより参入障壁が大幅に下がります。 より多くの人々 (私も含めて ✋) が高性能な機械学習アルゴリズムを作成できるようにします。 毎日使用するプロジェクトのバックエンドに貢献できる人がますます増えています。 これにより、コミュニティが拡大し、実験が増え、プロジェクトがより持続可能なものとなり、言い換えれば、より健全で多様なエコシステムが実現します。 先ほど述べたトレンドに戻ると、フルスタックであることの威力が改めてわかります。つまり、モデル探索 (Python) の担当者は、ホット パスを Rust でドリルダウンして書き換え、最終ソリューションを最適化できるのです。 。 しかし、実際にこれを実行するのはどれほど難しいのでしょうか? クラスタリング アルゴリズムは Rust でどれくらい高速に実装できますか? 私は RustFest 2019 のワークショップを準備しました。ndarray (NumPy の Rust 版) を使用して、K-Means クラスタリング アルゴリズムをゼロから実装しました。 数週間前、私はワークショップについてのメモをいくつか書きました。関連資料は GitHub で見つかります。ワークショップは一連のテスト駆動型の演習で構成されており、各ステップが最終的なソリューションに貢献します。 この質問を無視することはできませんでした。Rust での K-Means のサンプル実装は、scikit-learn と比べてどれくらい速いのでしょうか? 私は RustFest で、この疑問に新たに興味を持った人々のグループと 2 日間を過ごし、ついに答えを見つけました。 @sitegui、@dunnock、@ThomAub がいなかったら、このプロセスはもっと長くかかっていたでしょう。ご協力ありがとうございました! 成し遂げる クリーンアップされた K-Means 実装を Rust クレートで公開しました: linfa-clustering。 linfa-clustering は linfa (https://crates.io/crates/linfa) のサブセットです。後者については後で詳しく説明します。 ソース コードからわかるように、明確で理解しやすい最適化構成に重点が置かれており、これはロイドのアルゴリズムの実装例です。 高速化の機会のほとんどは活用されておらず、さらに調整および洗練させる余地が確かにあります。たとえば、マルチスレッドは割り当てステップでのみ使用され、更新ステップでは依然としてシングルスレッドです。 直接比較するために、Python バインディングを作成しました。linfa は Python ライブラリとして PyPi にあります。 比較に焦点を当てたいと思います。
モデルをマイクロサービスとして公開することで、予測を提供するのにかかる時間を測定します。これは、このコードが本番環境で実行される方法に近いものです。 ベンチマークを再現するための手順、結果、コードは GitHub で入手できます。 トレーニングベンチマーク pytest-benchmark を使用して 100 万ポイントのデータセットで K-Means モデルをトレーニングすると、linfa は scikit-learn よりも 1.3 倍高速になります。 ライブラリ平均トレーニング時間 (ミリ秒) Linfa (Rust 上の Python ラッパー) 467.2 Scikit Learn 604.7 (1.3 倍遅い) 全体的に、速度はかなり似ていますが、割り当てステップの並列化により、linfa の方がわずかに速い可能性があります。 この結果に疑問を感じているなら、もう一度考えてみてください。ワークショップの指導にたった 2 日しかかからなかった実装と、最も確立された機械学習フレームワークで使用されている実装を比較しているのです。 それはおかしい。 ベンチマーク コードからわかるように、linfa K-Means 実装は scikit-learn に似たインターフェースを提供します。
Rust バージョンも紹介したいと思います。インターフェースが若干異なりますが (理由は別のブログ記事で説明する予定です)、同じ手順を簡単に理解できます。
推論ベンチマーク 前述したように、専用のマイクロサービスを使用して機械学習モデルを提供することは、業界で確立されたパターンです。 しかし、これらのマイクロサービスにはビジネス ロジックがほとんどないかまったくないことがほとんどです。つまり、リモート関数呼び出しに過ぎません。 シリアル化された機械学習モデルがあれば、API 生成を完全に自動化/抽象化できますか? Tensorflow Serving の人気が高まるにつれて、私のアイデアが検証されました。 そこで、次の 3 つのシナリオをベンチマークすることにしました。
これらの gRPC Web サーバーに対しては、いかなるチューニングも行っておらず、そのままのパフォーマンスを評価しています。もう一度、ソースコード (Rust/Python) をチェックしてみることをお勧めします。 Rust Web サーバー上の linfa は、scikit-learn よりも 1 秒あたり 25 倍多くのリクエストを処理し、Python gRPC サーバー上の linfa (Python ラッパー) よりも 7 倍多くのリクエストを処理します。 同じことがレイテンシ(応答に要する時間)にも当てはまり、Rust Web サーバー上の linfa は一貫して scikit-learn より 25 倍高速で、Python Web サーバー上の linfa(Python ラッパー)より 6 倍高速です。 Rust Web サーバー上の linfa は、高負荷時でもエラー率が最も低くなります。 新しいワークフロー この実験は規模が小さすぎて確固たる結論を導き出すことはできませんでしたが、K-Means の Lloyds アルゴリズムのより高速な実装が見つかるはずです。 しかし、これらの結果が、Rust が機械学習開発において実際に重要な役割を果たすことができるということを納得させるのに十分であることを願っています。 ndarray の使い方を学べば、誰でもこのような Rust 実装を書くことができます (ワークショップで提供される資料を試すことができます)。しかし、C と C++ の参入障壁のせいで、多くの機械学習実践者がどれほどの潜在能力を無駄にしているのでしょうか? それだけでは不十分な場合、Rust は Python の C および C++ バックエンドを置き換えるだけでなく、成長を続ける非同期エコシステムを活用してデプロイメントを処理することもできます。 やり方は簡単です:
これは間違いなく、2020 年に検討する価値のあるアイデアです。 下に行く 前述したように、linfa-clustering は、私が 2020 年に注力する予定の Rust の一般的な機械学習フレームワークである linfa のサブセットです。 現時点では、これをフレームワークと呼ぶのは時期尚早です。linfa-clustering を超えるものはあまりありません 😀。 大胆なミッションステートメントを達成するにはまだ長い道のりがありますが、機械学習および関連分野における Rust エコシステムへの関心が高まっています: https://github.com/rust-ml/discussion/issues/1、https://github.com/rust-lang/wg-governance/issues/11、https://github.com/rust-lang/wg-governance/issues/11。 時には、新たな火を起こすために必要なのは火花だけです。 実際、Rust での機械学習エコシステムの育成、構築、維持はコミュニティの努力によってのみ可能であり、近道はないと私は固く信じています。 Rust エコシステムには、機械学習のクレートが豊富に存在します。crates.io で機械学習を検索すると、どれだけの数のクレートが返されるか見てみましょう。 すべてをゼロから書き直す必要はありません。linfa は、Rust エコシステムから厳選されたアルゴリズム実装のコレクションであるメタパッケージであると私は考えています。 Python の scikit-learn と同様に、機械学習のニーズを満たす最初の場所です。 この投稿があなたに共感を与えたなら、ぜひロードマップ (https://github.com/LukeMathWalker/linfa/issues) をご覧ください。あなたの貢献を期待しています! |
<<: Matplotlib の使用が難しいと感じるのはなぜですか?このマインドマップをまだ見ていないので
>>: 3行のコードでモデルのトレーニングを高速化: このアルゴリズムにより、GPUの古い木に新しい花が咲きます
[[263249]]ビッグデータダイジェスト制作出典: medium編纂者:周嘉楽、郭小白、蒋宝尚...
8月1日、ガートナーの最新レポートによると、カスタマーサービスセンター(CC)テクノロジー、会話型A...
世界の自動車産業におけるインテリジェンスと車両のインターネットの発展により、新時代の人々はますます便...
[[394413]]著者: 李 鴻燕IBM Greater China テクノロジー部門、データ、人...
次のような疑問を持ったことはありませんか?人工知能は非常に人気があります。従来のプログラマーとして、...
この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...
ロボットは新しい常態の中で私たちの生活を変えています。たとえば、ソーシャルロボットには、感情療法、認...
TL;DR — 優れた機械学習アプリケーションを構築することは、ミシュランの星を獲得した料理を作るよ...
旅行のピーク時に都市環境衛生がより大きな圧力に耐えられるか?清掃車両と清掃作業員をより適切に管理する...
人工知能 (AI) と機械学習 (ML) は、現代のソフトウェア開発の重要な部分になりつつあります。...