From 4f51bd8e1bf5df9c51d41752ed1773b8fe74bbc8 Mon Sep 17 00:00:00 2001 From: Arthur Date: Tue, 22 Jul 2025 14:29:12 +0200 Subject: [PATCH] dmr: add GHA example (#23136) Add GHA workflow example for DMR --------- Co-authored-by: Allie Sadler <102604716+aevesdocker@users.noreply.github.com> --- content/manuals/ai/model-runner/_index.md | 183 ++++++++++++++++++ .../_default/_markup/render-codeblock.html | 2 +- 2 files changed, 184 insertions(+), 1 deletion(-) diff --git a/content/manuals/ai/model-runner/_index.md b/content/manuals/ai/model-runner/_index.md index 5e6ecdc0a9..f21e329ada 100644 --- a/content/manuals/ai/model-runner/_index.md +++ b/content/manuals/ai/model-runner/_index.md @@ -252,6 +252,8 @@ For more details, see the [`docker model package`](/reference/cli/docker/model/p ## Example: Integrate Docker Model Runner into your software development lifecycle +### Sample project + You can now start building your Generative AI application powered by the Docker Model Runner. If you want to try an existing GenAI application, follow these instructions. @@ -272,6 +274,187 @@ You'll see the GenAI app's interface where you can start typing your prompts. You can now interact with your own GenAI app, powered by a local model. Try a few prompts and notice how fast the responses are — all running on your machine with Docker. +### Use Model Runner in GitHub Actions + +Here is an example on how to use Model Runner as part of a GitHub workflow. +The example installs Model Runner, tests the installation, pulls and runs a model, +interacts with the model via the API and finally deletes the model. + +```yaml {title="dmr-run.yml", collapse=true} +name: Docker Model Runner Example Workflow + +permissions: + contents: read + +on: + workflow_dispatch: + inputs: + test_model: + description: 'Model to test with (default: ai/smollm2:360M-Q4_K_M)' + required: false + type: string + default: 'ai/smollm2:360M-Q4_K_M' + +jobs: + dmr-test: + runs-on: ubuntu-latest + timeout-minutes: 30 + + steps: + - name: Set up Docker + uses: docker/setup-docker-action@v4 + + - name: Install docker-model-plugin + run: | + echo "Installing docker-model-plugin..." + # Add Docker's official GPG key: + sudo apt-get update + sudo apt-get install ca-certificates curl + sudo install -m 0755 -d /etc/apt/keyrings + sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc + sudo chmod a+r /etc/apt/keyrings/docker.asc + + # Add the repository to Apt sources: + echo \ + "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \ + $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \ + sudo tee /etc/apt/sources.list.d/docker.list > /dev/null + sudo apt-get update + sudo apt-get install -y docker-model-plugin + + echo "Installation completed successfully" + + - name: Test docker model version + run: | + echo "Testing docker model version command..." + sudo docker model version + + # Verify the command returns successfully + if [ $? -eq 0 ]; then + echo "✅ docker model version command works correctly" + else + echo "❌ docker model version command failed" + exit 1 + fi + + - name: Pull the provided model and run it + run: | + MODEL="${{ github.event.inputs.test_model || 'ai/smollm2:360M-Q4_K_M' }}" + echo "Testing with model: $MODEL" + + # Test model pull + echo "Pulling model..." + sudo docker model pull "$MODEL" + + if [ $? -eq 0 ]; then + echo "✅ Model pull successful" + else + echo "❌ Model pull failed" + exit 1 + fi + + # Test basic model run (with timeout to avoid hanging) + echo "Testing docker model run..." + timeout 60s sudo docker model run "$MODEL" "Give me a fact about whales." || { + exit_code=$? + if [ $exit_code -eq 124 ]; then + echo "✅ Model run test completed (timed out as expected for non-interactive test)" + else + echo "❌ Model run failed with exit code: $exit_code" + exit 1 + fi + } + - name: Test model pull and run + run: | + MODEL="${{ github.event.inputs.test_model || 'ai/smollm2:360M-Q4_K_M' }}" + echo "Testing with model: $MODEL" + + # Test model pull + echo "Pulling model..." + sudo docker model pull "$MODEL" + + if [ $? -eq 0 ]; then + echo "✅ Model pull successful" + else + echo "❌ Model pull failed" + exit 1 + fi + + # Test basic model run (with timeout to avoid hanging) + echo "Testing docker model run..." + timeout 60s sudo docker model run "$MODEL" "Give me a fact about whales." || { + exit_code=$? + if [ $exit_code -eq 124 ]; then + echo "✅ Model run test completed (timed out as expected for non-interactive test)" + else + echo "❌ Model run failed with exit code: $exit_code" + exit 1 + fi + } + + - name: Test API endpoint + run: | + MODEL="${{ github.event.inputs.test_model || 'ai/smollm2:360M-Q4_K_M' }}" + echo "Testing API endpoint with model: $MODEL" + + # Test API call with curl + echo "Testing API call..." + RESPONSE=$(curl -s http://localhost:12434/engines/llama.cpp/v1/chat/completions \ + -H "Content-Type: application/json" \ + -d "{ + \"model\": \"$MODEL\", + \"messages\": [ + { + \"role\": \"user\", + \"content\": \"Say hello\" + } + ], + \"top_k\": 1, + \"temperature\": 0 + }") + + if [ $? -eq 0 ]; then + echo "✅ API call successful" + echo "Response received: $RESPONSE" + + # Check if response contains "hello" (case-insensitive) + if echo "$RESPONSE" | grep -qi "hello"; then + echo "✅ Response contains 'hello' (case-insensitive)" + else + echo "❌ Response does not contain 'hello'" + echo "Full response: $RESPONSE" + exit 1 + fi + else + echo "❌ API call failed" + exit 1 + fi + + - name: Test model cleanup + run: | + MODEL="${{ github.event.inputs.test_model || 'ai/smollm2:360M-Q4_K_M' }}" + + echo "Cleaning up test model..." + sudo docker model rm "$MODEL" || echo "Model removal failed or model not found" + + # Verify model was removed + echo "Verifying model cleanup..." + sudo docker model ls + + echo "✅ Model cleanup completed" + + - name: Report success + if: success() + run: | + echo "🎉 Docker Model Runner daily health check completed successfully!" + echo "All tests passed:" + echo " ✅ docker-model-plugin installation successful" + echo " ✅ docker model version command working" + echo " ✅ Model pull and run operations successful" + echo " ✅ API endpoint operations successful" + echo " ✅ Cleanup operations successful" +``` + ## FAQs ### What models are available? diff --git a/layouts/_default/_markup/render-codeblock.html b/layouts/_default/_markup/render-codeblock.html index c0a0addb6d..60d4db13c1 100644 --- a/layouts/_default/_markup/render-codeblock.html +++ b/layouts/_default/_markup/render-codeblock.html @@ -64,7 +64,7 @@