Ollama と testcontainers を使用してプログラムで抱きしめる顔モデルを実行する方法

Hugging Faceは現在、 700以上の000 モデルをホストしており、その数は継続的に増加しています。 これは、AI/MLモデルの最高のリポジトリとなり、一般的なニーズと高度に専門化されたニーズの両方に対応しています。

AI/MLモデルの採用が加速するにつれて、より多くのアプリケーション開発者がそれらをプロジェクトに統合することを熱望しています。 ただし、セットアップが複雑で、開発者にとって使いやすいツールがないため、参入障壁は依然として高いままです。 AI/MLモデルのデプロイが、データベースを起動するのと同じくらい簡単だと想像してみてください。 興味。 その方法を知るために読み続けてください。

2400x x は、ollama と testcontainers を使用してプログラムで抱きしめる顔モデルを実行する方法を1260 します

Ollama と Testcontainers の概要

最近、Ollama は Hugging Face のランニング モデルのサポートを発表しました。 この開発は、Hugging FaceのAI/MLコンポーネントの豊富なエコシステムを、開発者であることが多いOllamaのエンドユーザーにもたらすため、エキサイティングです。 

Testcontainersライブラリはすでに Ollamaモジュールを提供しているため、Dockerを使用してOllamaを実行する方法の詳細を知らなくても、Ollamaでコンテナを簡単にスピンアップできます。

import org.testcontainers.ollama.OllamaContainer; 

var ollama = new OllamaContainer("ollama/ollama:0.1.44"); 
ollama.start();

これらのコード行は、Ollama を Docker コンテナー内で簡単に実行するために必要なすべてです。

Ollama でモデルを実行する

デフォルトでは、Ollama にはモデルが含まれていないため、使用するモデルをダウンロードする必要があります。 Testcontainersでは、Testcontainersが提供するexecInContainer APIを利用することで、この手順は簡単です。

ollama.execInContainer("ollama", "pull", "moondream");

この時点で、 moondream モデルを Ollama API 経由で使用する準備が整いました。 

試してみたいですか? ちょっと待ってください。 このモデルはコンテナ内で実行されているため、コンテナが死んだ場合はどうなりますか? 新しいコンテナをスピンアップして、モデルを再度プルする必要がありますか? これらのモデルは非常に大きくなる可能性があるため、理想的にはそうではありません。

ありがたいことに、Testcontainersは、プログラムでコンテナイメージをコミットするための使いやすいAPIを提供することで、このシナリオを簡単に処理できます。

public void createImage(String imageName) {
var ollama = new OllamaContainer("ollama/ollama:0.1.44");
ollama.start();
ollama.execInContainer("ollama", "pull", "moondream");
ollama.commitToImage(imageName);
}

このコードは、モデルを含むコンテナーからイメージを作成します。 その後の実行では、そのイメージからコンテナーを作成でき、モデルは既に存在します。 パターンは次のとおりです。

var imageName = "tc-ollama-moondream";
var ollama = new OllamaContainer(DockerImageName.parse(imageName)
.asCompatibleSubstituteFor("ollama/ollama:0.1.44"));
try {
ollama.start();
} catch (ContainerFetchException ex) {
// If image doesn't exist, create it. Subsequent runs will reuse the image.
createImage(imageName);
ollama.start();
}

これで、モデルを使用する準備ができ、Ollamaで実行されているため、そのAPIを操作できます。

var image = getImageInBase64("/whale.jpeg");
String response = given()
.baseUri(ollama.getEndpoint())
.header(new Header("Content-Type", "application/json"))
.body(new CompletionRequest("moondream:latest", "Describe the image.", Collections.singletonList(image), false))
.post("/api/generate")
.getBody().as(CompletionResponse.class).response();

System.out.println("Response from LLM " + response);

Hugging Face モデルの使用

前の例では、Ollama によって既に提供されているモデルを使用して説明しました。 ただし、OllamaでHugging Faceモデルを使用できるようになったため、利用可能なモデルオプションが数千に拡大されました。 

Hugging Face in Ollama のモデルを使用するには、モデルの GGUF ファイルが必要です。現在、 GGUF形式で利用可能な 20、647 モデルがあります。 なんてクールなんだろう?

Ollama で Hugging Face モデルを実行する手順は簡単ですが、カスタム OllamaHuggingFaceContainerにスクリプト化することで、プロセスをさらに簡略化しました。このカスタムコンテナはデフォルトライブラリの一部ではないため、 OllamaHuggingFaceContainer の実装をコピーして貼り付け、ニーズに合わせてカスタマイズできます。

Hugging Face モデルを実行するには、次の操作を行います。

public void createImage(String imageName, String repository, String model) {
var model = new OllamaHuggingFaceContainer.HuggingFaceModel(repository, model);
var huggingFaceContainer = new OllamaHuggingFaceContainer(hfModel);
huggingFaceContainer.start();
huggingFaceContainer.commitToImage(imageName);
}

図のようにリポジトリ名とモデルファイルを指定することで、Testcontainersを介してOllamaでHugging Faceモデルを実行できます。 

埋め込みモデルを使用した例チャットモデルを使用した例は、GitHub にあります。

コンテナをカスタマイズする

Testcontainersを使用する主な強みの1つは、複雑なセットアップを管理可能なコンテナにカプセル化することで、特定のプロジェクトニーズに合わせてコンテナのセットアップを柔軟にカスタマイズできることです。 

たとえば、要件に合わせたカスタムコンテナを作成できます。 DavidAU/DistiLabelOrca-TinyLLama-1.1B-Q8_0-GGUF をスピンアップするための特殊なコンテナである TinyLlama の例を次に示します Hugging Faceのモデル:

public class TinyLlama extends OllamaContainer {

    private final String imageName;

    public TinyLlama(String imageName) {
        super(DockerImageName.parse(imageName)
.asCompatibleSubstituteFor("ollama/ollama:0.1.44"));
        this.imageName = imageName;
    }

    public void createImage(String imageName) {
        var ollama = new OllamaContainer("ollama/ollama:0.1.44");
        ollama.start();
        try {
            ollama.execInContainer("apt-get", "update");
            ollama.execInContainer("apt-get", "upgrade", "-y");
            ollama.execInContainer("apt-get", "install", "-y", "python3-pip");
            ollama.execInContainer("pip", "install", "huggingface-hub");
            ollama.execInContainer(
                    "huggingface-cli",
                    "download",
                    "DavidAU/DistiLabelOrca-TinyLLama-1.1B-Q8_0-GGUF",
                    "distilabelorca-tinyllama-1.1b.Q8_0.gguf",
                    "--local-dir",
                    "."
            );
            ollama.execInContainer(
                    "sh",
                    "-c",
                    String.format("echo '%s' > Modelfile", "FROM distilabelorca-tinyllama-1.1b.Q8_0.gguf")
            );
            ollama.execInContainer("ollama", "create", "distilabelorca-tinyllama-1.1b.Q8_0.gguf", "-f", "Modelfile");
            ollama.execInContainer("rm", "distilabelorca-tinyllama-1.1b.Q8_0.gguf");
            ollama.commitToImage(imageName);
        } catch (IOException | InterruptedException e) {
            throw new ContainerFetchException(e.getMessage());
        }
    }

    public String getModelName() {
        return "distilabelorca-tinyllama-1.1b.Q8_0.gguf";
    }

    @Override
    public void start() {
        try {
            super.start();
        } catch (ContainerFetchException ex) {
            // If image doesn't exist, create it. Subsequent runs will reuse the image.
            createImage(imageName);
            super.start();
        }
    }
}

定義すると、カスタムコンテナを簡単にインスタンス化して、アプリケーションで利用することができます。

var tinyLlama = new TinyLlama("example");
tinyLlama.start();
String response = given()
.baseUri(tinyLlama.getEndpoint())
.header(new Header("Content-Type", "application/json"))
.body(new CompletionRequest(tinyLlama.getModelName() + ":latest", List.of(new Message("user", "What is the capital of France?")), false))
.post("/api/chat")
.getBody().as(ChatResponse.class).message.content;
System.out.println("Response from LLM " + response);

すべての実装の詳細はTinyLlamaクラスのカバー下にあり、エンドユーザーはモデルを実際にOllamaにインストールする方法、GGUFとは何か、またはpip install のhuggingface-hubhuggingface-cliを取得する必要があることを知る必要はありません。

このアプローチの利点

  • プログラムによるアクセス: 開発者は、Hugging Face エコシステムにプログラムでシームレスにアクセスできます。
  • 再現可能な構成: セットアップからライフサイクル管理まで、すべての構成が体系化され、チームメンバーとCI環境全体での再現性が確保されます。
  • 使い慣れたワークフロー: コンテナを使用することで、コンテナ化に精通している開発者は AI/ML モデルを簡単に統合でき、プロセスにアクセスしやすくなります。
  • 自動セットアップ: 開発者に簡単なクローンと実行のエクスペリエンスを提供します。

このアプローチは、Testcontainersモジュールによって提供される自動化とカプセル化によってサポートされるHugging FaceとOllamaの両方の長所を活用し、さまざまなエコシステムの開発者が強力なAIツールをよりアクセスしやすく管理しやすくします。

結論

AIモデルをアプリケーションに統合することは、必ずしも困難な作業ではありません。 Ollama と Testcontainers を活用することで、開発者は最小限の労力で Hugging Face モデルをプロジェクトにシームレスに組み込むことができます。 このアプローチにより、開発環境プロセスのセットアップが簡素化されるだけでなく、再現性と使いやすさも保証されます。 モデルをプログラムで管理し、一貫性のある環境のためにコンテナ化する機能により、開発者は複雑なセットアップ手順に煩わされることなく、革新的なソリューションの構築に集中できます。

OllamaのHugging FaceモデルのサポートとTestcontainersの堅牢なコンテナ管理機能の組み合わせは、最新のAI開発のための強力なツールキットを提供します。 AIが進化と拡大を続けるにつれて、これらのツールは、さまざまな分野の開発者が高度なモデルにアクセスして管理できるようにする上で重要な役割を果たします。 そのため、さまざまなモデルを試して、今すぐアプリケーションで AI の可能性を解き放ちましょう。

Docker の最新ニュースをお届けします。 Docker ニュースレターを購読する。

さらに詳しく