質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Rust

Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

921閲覧

機械学習を使ったシステム構成

k_k_kk

総合スコア3

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Rust

Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/11/10 04:57

編集2021/11/10 05:13

以下の処理フローを実現するシステムを作りたいと考えています。
1.データ取得、データ整形、データベースに保存
2.データベースからデータを取り出し機械学習
3.2の機械学習の結果からパラメータを決定し外部apiを叩く

そこで、RustとPythonを使って作りたいと思ってるのですが、システム構成で悩んでいます。
思いついたのは以下の二つです。
・Rustで1,3の処理をしてPythonで2の処理をする。2でPythonが行った機械学習の結果は、メッセージキューを使ってRustのプロセスに渡す。
・1,2,3を全てPythonで行う。

どちらが早く処理できると思いますでしょうか?また、メッセージキューよりも良いデータの受け渡し方法があればご意見伺いたいです。
前者だとRustは高速にデータを処理できるがキューを介しているのでそこで後者より遅いのではないかと思っています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/11/10 12:24

Rustは分かりませんが、どれくらいの規模のデータを扱うかでもスピードが変わってくると思います。いかがでしょうか? (規模が小さければやりやすいやり方で済ませてし待っても問題ない、Rustでシステムを作る手間を考えれば処理が遅くても全部Pythonでいいや、もあり得ると思います)。
k_k_kk

2021/11/10 13:12 編集

データは気象に関するデータで1秒に1回500Bのデータが送られてくる想定です。 全部Pythonが楽かなとも考えてるのですが、自分としてはRustの方が慣れているのもあって機械学習を使う処理以外はRustで実行したいとも考えています。
退会済みユーザー

退会済みユーザー

2021/11/10 21:16

すでにご存じと思いますが、Pythonで機械学習をするのはすごく楽です。いわゆる"機械学習"であれば、10行もいらないくらいのポン付けコードで動きます。RustでCSVにしてしまえば、あとは楽かもしれませんね! https://scikit-learn.org/stable/ RustとPythonのやりとりは、A.物理的メディアにファイルに保存して、B.RAMディスクに保存して、C.RustからコマンドラインでPythonを読みだして返り値を使う、D.127.0.0.1でソケット通信くらいしか思いつきません。Pythonだけであれば、AやBよりもDの方が早いです。CとDはRustでの実装のしやすさで選んだらよさそうですね。
guest

回答2

0

ベストアンサー

また、メッセージキューよりも良いデータの受け渡し方法があればご意見伺いたいです。

他の回答にあるように、Pythonを介さずに、Rustから機械学習ライブラリーのコアが使えるなら、それが一番効率が良いと思います。

次に効率が良さそうなのはPyO3を使う方法です。以下のことができます。

  1. PythonモジュールをRustで書き、Pythonコードから呼ぶ。(Rustコードは共有ライブラリーへとコンパイルされ、Pythonインタープリターがそれをロードして使う)
  2. Rustコード内でPythonインタープリターを起動し、Pythonコードを実行する

Pythonのデータ型からRustのデータ型への変換と、その逆の変換は、単純な型ならPyO3が自動的に行ってくれます

「質問への追記・修正依頼」欄のコメントからすると、Rustを主にして、機械学習はPythonにということだと思いますので、2.の形態の方が合っているように見えます。ただ、機械学習の場合は、C/C++で書かれたネイティブライブラリーに依存していますので、動作させるために必要な設定を見つけるのが大変かもしれません。

1.の形態なら簡単かつ確実に動作するのでないかと思います。その場合、質問にある1の処理と3の処理はPyO3+Rustで実装し、Pythonコードから呼ぶことになります。

PyO3以外の連携方法は大体以下のようになるでしょうか。(「質問への追記・修正依頼」に他の方が書かれたものと基本的に同じです)

  1. ファイル(物理的メディア、または、RAMディスク)で連携する
  2. コマンドラインでPythonを実行して、標準出力に書かれた情報を使う
  3. REST APIやgRPC APIで連携する
  4. メッセージキューで連携する

2.は、もし毎秒発生するデーターをその都度処理したいのでしたら、ちょっと無理がありそうです。(機械学習の処理は、どの程度の時間がかかるのでしょうか? 1秒以内 or それ以上?)

3と4は実装が面倒そうなのと、実行時のオーバーヘッド(本来の処理以外にかかる時間)も大きそうです。

投稿2021/11/11 06:16

tatsuya6502

総合スコア2046

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

Python にある機械学習ライブラリのコアはほとんどの場合 C か C++ で書かれています。また PyTorch のように C++ の API 備えている場合もあります。あとは Rust から FFI で呼び出しやすいようラッパーを書いて読み込むという方法で扱うことができるでしょう。実際に PyTorch の Rust バインディングがあるようです。その他の機械学習フレームワークでも同じように利用できると思います。

投稿2021/11/11 05:04

A_kirisaki

総合スコア2853

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問