Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

Ruby on Rails 用 LiteStack:ワンストップのデータ管理ソリューション

この一連の投稿では、LiteStack について見ていきます。 、すべての本番データを 1 台のマシンでホストして処理するワンストップ ショップ ソリューションです。 LiteStack (名前が示すとおり) は SQLite を利用して以下を提供します。

  • LiteDB を使用したデータベース アダプター
  • ActiveJob バックエンド (LiteJob) )
  • ActionCable バックエンド (LiteCable) )
  • ActiveSupport::Cache ストア (LiteCache) )

この最初の投稿では、LiteStack の基本を紹介し、サンプルの Rails アプリケーションをセットアップします。

始めましょう!

SQLite の概要

SQLite 自体は、何十年にもわたって多くの業界で頼りになる組み込みデータベースです。たとえば、ネイティブ アプリ開発、テスト環境、キャッシュなどで広く使用されています。

しかし最近では、多くの実験や拡張が行われるようになりました。最も人気のある拡張機能の 1 つは Litestream で、ストリームの変更を S3 互換バケットに復元できます。つまり、本番データベースのレプリカを非常に安価な価格で入手でき、いつでも障害から回復できるようになります。

ちなみに、これにより、Rails アプリの実稼働データベースとして SQLite を使用することが実現可能なオプションになりました。 LiteStack のような本格的な開発スタックと組み合わせることで、単一マシン上でホストされるアプリの実現が約束されます。私たちはこの仮説を検証し、それを阻む障害を指摘するためにここにいます。

これを行うには、潜在的な問題を明らかにするのに十分複雑でありながら、このシリーズに適合するのに十分シンプルなサンプル アプリが必要です。

Rails アプリケーションの例

私たちは、replicate.com の StableDiffusion を使用して子供の絵を変換するアプリを作成します。

例として、娘が描いたかわいいテディベアをいくつかの StableDiffusion 解釈とともに示します。

Ruby on Rails 用 LiteStack:ワンストップのデータ管理ソリューション

大まかなスケッチとして、私たちのアプリは次のステップをカバーします:

<オル>
  • ユーザーはテキスト プロンプトを含む画像をアップロードします (ここでは高度な SQLite テクニックをいくつか紹介します)。
  • ユーザーは画像スタイル (「漫画」、「油絵」、「フォトリアリスティック」、「3D レンダリング」など) を選択します。
  • 処理はバックグラウンドで行われます (これにより、LiteJob が開始されます) -パワージョブ)。
  • 処理の進行中、プレースホルダー画像が表示され、サーバーから送信されたログが更新されます。完了したら、実際の画像が表示されるように更新します。これにより、LiteCable を探索できるようになります。 ターボ ストリーム経由で画像を置き換えるので
  • 画像予測を保存します。
  • 私たちはLiteCacheを使用します 計算コストのかかるビューをラップするため。
  • これらの手順は、このシリーズの足場となります。ただし、この投稿の残りの部分では、アプリのセットアップについて説明します。

    まず、skAItch という新しい Rails アプリを作成します。 esbuild を JavaScript バンドラーとして使用し、SASS を CSS プリプロセッサとして使用します。

     

    LiteStack をインストールする

    次に、付属のジェネレーターを使用して LiteStack をインストールします。

     

    それが完了したら、セットアップを完了し、開発サーバーを起動します。

     

    認証とテナント

    次に、ユーザーを認証してプロンプトをユーザーに関連付ける方法が必要になります。 Devise のような既存企業を利用するのではなく、別のアプローチを採用することにしました。認証ゼロ gem は、認証システムをエンジンとして組み込むのではなく、柔軟に生成できます。便利なことに、次のようなオプションが付属しています。

    • トークンによる認証 (API の場合)
    • 2 要素認証
    • マルチテナント
    • レート制限
    • OmniAuth インターフェース
    • パスワードなしの認証

    --tenantable を追加することにしました。 データベース レコードの範囲をアカウントに自動的に設定することは常に良い考えであるため、このオプションを使用します。 Authentication-zero は、これを AccountScoped で提供します。 モデルに関する懸念。

     

    データベース シードを使用して最初のユーザーを追加しましょう:

     

    プロンプト足場

    ここで、実際のアプリケーション ロジックの作成を開始します。まず、アプリの中心モデルである Prompt を定義します。 .

    プロンプトには、タイトル、説明、およびプロンプトを作成したアカウントへの参照が必要です。さらに、SQLite の「ファイル システム」機能をテストするために、プロンプト イメージをバイナリ形式で保存したいと考えています。

     

    prompts config/routes.rb にもリソース エントリが追加されます。 。認証ゼロでは before_action が追加されることに注意してください。 ユーザーを ApplicationController に認証しています デフォルトでは。

     

    さらに、AccountScoped も含めます。 プロンプト モデルでは、保存されているレコードの範囲をログイン アカウントごとに絞り込むことができます。また、プロンプトのタイトルと画像が存在することも検証します。

     

    マルチテナンシーを有効にする最後のステップとして、アカウントの作成時にプロンプトをアカウントに接続する必要があります。これは PromptsController で行います。 :

     

    Rails アプリケーションを Replicate.com に接続する

    Replicate.com は、高性能グラフィック カードで AI 予測を実行するための主要なプラットフォームです。予測の作成、モデルのトレーニングと保存などを行うための API を備えています。これを使用するには、https://replicate.com/account/api-tokens から API トークンを取得する必要があります。

    注: Replicate での予測の実行には料金がかかります。

    幸いなことに、API と連携する公式クライアントと非公式クライアントが存在します。そのようなラッパーの 1 つは、これからインストールする、replicate-rails gem です。

     
     

    API キーを安全に保存するために、Rails 認証情報を使用します。

     
     

    このファイルを編集して保存すると、認証情報が暗号化され、正しい RAILS_MASTER_KEY を指定しないと開くことができません。 .

    さあ、それを活用しなければなりません。レプリケートレールの README で提案されているように、初期化子で Replicate に対して認証を行います。また、Webhook ハンドラーも定義します。これは (私たちの場合は) 同じファイルに置かれた単なるクラスです。 binding.irb を追加したことに注意してください。 機能の最初のテストのためにここにブレークポイントを設定します。

     

    Replicate-rails には、上記のハンドラーを呼び出すデフォルトの Webhook コントローラーも同梱されています。 config/routes.rb にマウントするだけです。 :

     

    Webhook をローカルでテストするには、Ngrok などを使用してトンネルを設定する必要があります。設定手順はこの記事の範囲外ですが、非常に簡単です。 Ngrok のドキュメントを参照してください。

    ただし、トンネルの URL をリッスンする可能性があることを Rails に伝える必要があります。これを有効にするには、allowed_hosts に追加します。 config/application.rb で :

     

    予測の実行

    次に、予測の作成をテストします。唯一欠けている部分は、PromptsController に接続することです。 。一般的なワークフローは次のとおりです。

    <オル>
  • モデルを取得します (この場合、stable-diffusion-img2img) モデル)レプリケートから。
  • 特定のバージョン (この場合は最新バージョン) を取得して、予測を実行します。
  • 以下を指定して予測を実行します。
    • 画像を説明するテキスト プロンプト(この場合はプロンプトのタイトル)。
    • Base64 でエンコードされたデータ URL として提供する必要がある画像プロンプト。
    • 予測が完了したときに ping を送信する Webhook (replicate-rails によって提供される Webhook ルートを指します)。
  •  

    https://YOUR_NGROK_URL/prompts/new にアクセスし、タイトルと一緒に画像をアップロードすると、予測がトリガーされます。完了すると、提供された Webhook 経由でコールバックされます。 binding.irb を設定したためです。 そこにブレークポイントがあると、コントローラーのアクションが REPL で停止し、周囲を見てみることができます。

     

    ご覧のとおり、イメージ間の生成の最初の実行は成功しました。予測モデルは、ローカルに保存する必要がある作成された画像への URL を返します (これらは、複製時に定期的に削除されます)。次回はこれについて詳しく見ていきます。

    次は、LiteDB の詳細

    この冒頭の投稿では、Rails アプリのすべてのコンポーネントを 1 台のマシンでホストするための興味深い代替手段として LiteStack 環境を紹介しました。さらに、AI 画像生成のために Replicate.com と通信するサンプル アプリをセットアップしました。

    このシリーズの次のパートでは、LiteStack の最初の中心要素である LiteDB について説明します。 — さらに詳しく。これを独特の強力にするいくつかの特性、一般的な落とし穴、制限、トレードオフについて見ていきます。

    それまで、コーディングを楽しんでください!

    追記Ruby Magic の投稿を報道後すぐに読みたい場合は、Ruby Magic ニュースレターを購読して、投稿を 1 つも見逃さないようにしてください。


    1. Ruby における明示的なキャストと暗黙的な強制:#to_s と #to_str の説明

      型強制とは、オブジェクトの型とその値を別の型に変更することです。たとえば、#to_s を使用して整数を文字列に変更します。 または #to_i を使用して Float を整数に変換します 。おそらくあまり知られていない #to_str と #to_int 一部のオブジェクトが実装するメソッドは一見すると同じことを行いますが、いくつかの違いがあります。 AppSignal アカデミーのこの版では、型キャスト アクターについて簡単に触れながら、Ruby での型の明示的なキャストと暗黙的な強制について詳しく説明します。両方の方法の違いを説明し、それらの使用方法について説明します。 まず、通常、明

    2. Rubyでのマージソートの調査

      これは、Rubyを使用したさまざまなソートアルゴリズムの実装を検討するシリーズのパート3です。パート1ではバブルソートについて説明し、パート2では選択ソートについて説明しました。 このシリーズの以前の投稿で説明したように、データの並べ替え方法を理解することは、ソフトウェアエンジニアのツールキットの不可欠な部分です。幸い、Rubyのようなほとんどの高級言語には、配列のソートに効率的な組み込みメソッドがすでに組み込まれています。たとえば、.sortを呼び出す場合 アレイでは、内部でクイックソートを使用しています。この投稿では、クイックソートと同様のアルゴリズム(マージソート)を学習します。これ