大数跨境

Docker 可以在本地运行 LLM——等等,什么!?

Docker 可以在本地运行 LLM——等等,什么!? 索引目录
2025-04-16
4
导读:使用 Docker 在本地运行大型语言模型 (LLM)?是的,你没听错。Docker 现在的功能远不止运行容器镜像。

使用 Docker 在本地运行大型语言模型 (LLM)?是的,你没听错。Docker 现在的功能远不止运行容器镜像。使用Docker Model Runner,你可以在本地运行 LLM 并与之交互。

毋庸置疑,我们已经看到人工智能和 GenAI 的开发领域发生了巨大的转变。而开发一个由 GenAI 驱动的应用程序并非易事,因为从成本到设置,需要耗费大量精力。Docker 一如既往地发挥了它的优势:简化 GenAI 开发,让开发者能够更快地构建和交付产品和项目。我们可以在自己的机器上原生运行 AI 模型!没错,它在容器之外运行模型。目前,Docker Model Runner 处于 Beta 阶段,适用于搭载 Apple Silicon 芯片的 Mac 版 Docker Desktop,需要 Docker Desktop 4.40 或更高版本。

在本篇博文中,我们将探讨 Docker Model Runner 的优势以及如何以各种形式使用它。让我们立即开始吧!

Docker Model Runner 的优势

  • 开发人员流程:作为开发人员,我们不喜欢的最重要的方面之一是上下文切换和使用 100 种不同的工具,而几乎所有其他开发人员都在使用的 Docker 使事情变得简单并降低了学习曲线。

  • GPU 加速:Docker Desktop直接在主机上运行llama.cpp 。推理服务器可以访问 Apple 的 Metal AP,从而可以直接访问 Apple Silicon 上的硬件 GPU 加速。

  • OCI Artifcats:将 AI 模型存储为 OCI Artifcats,而不是 Docker 镜像。这可以节省磁盘空间并减少提取所有内容的工作。此外,由于 OCI Artifcats 是行业标准格式,因此可以提高兼容性和适应性。

  • 一切本地化:您无需担心云 LLM API 密钥、速率限制、延迟等问题,只需在本地绑定产品并支付高昂的费用即可。此外,数据隐私和安全也至关重要。模型会在需要时由 llama.cpp 动态加载到内存中。

行动中

确保系统中已安装 Docker Desktop v4.40 或更高版本。安装完成后,请前往“设置”>“开发功能”> “启用 Docker 模型运行器”。您还可以勾选“启用主机端 TCP 支持”以便与本地主机进行通信(我们将在下面看到一个演示)。



完成后,点击“应用并重启”,一切就绪了。为了测试它是否正常工作,请打开任意类型的终端docker model,您将看到所有可用命令的输出,这可以验证一切是否按预期工作。

因此,要与 LLM 进行交互,我们有两种方法(目前为止,敬请期待):CLI 或 API(与 OpenAI 兼容)。CLI 的 API 界面非常简单。我们可以从正在运行的容器内部或本地主机与 API 进行交互。让我们更详细地了解一下这些方法。

从 CLI

如果您使用过 docker cli(几乎每个使用过容器的开发人员都用过),并且使用过诸如、等命令docker pulldocker run那么 docker 模型使用相同的模式,只是多了一个子命令,也就是model关键字。因此,要拉取一个模型,我们只需执行docker model pull <model name>或运行拉取的模型docker model run <model name>即可。这让事情变得简单得多,因为我们不需要为新工具学习全新的术语。

以下是目前支持的所有命令。更多命令即将推出(其中一些是我最喜欢的)。敬请期待!



现在,要运行一个模式,我们首先需要将其拉取下来。例如,我们将运行llama3.2。您将在Docker Hub 的 GenAI 目录上找到所有可用的模型。因此,打开终端并运行docker model pull ai/llama3.2。拉取它需要一些时间,具体取决于模型大小和您的互联网带宽。拉取完成后,运行docker model run ai/llama3.2,它将像普通聊天机器人或 ChatGPT 一样启动非活动聊天,完成后,您可以使用/bye它退出交互式聊天模式。以下是屏幕截图:



来自 API(OpenAI)

Model Runner 的一大亮点在于它实现了与 OpenAI 兼容的端点。我们可以通过多种方式与 API 进行交互,例如在正在运行的容器内,或者在主机上使用 TCP 或 Unix Sockets 进行交互。

我们将看到不同方式的示例,但在此之前,这里是可用的端点。无论我们从容器内部还是从主机与 API 交互,端点都将保持不变。只有主机会发生变化。

# OpenAI endpoints
GET /engines/llama.cpp/v1/models
GET /engines/llama.cpp/v1/models/{namespace}/{name}
POST /engines/llama.cpp/v1/chat/completions
POST /engines/llama.cpp/v1/completions
POST /engines/llama.cpp/v1/embeddings
Note: You can also omit llama.cpp.

从容器内部

在容器内部,我们将使用http://model-runner.docker.internal它作为基础 URL,并且可以访问上面提到的任何端点。例如,我们将访问/engines/llama.cpp/v1/chat/completions该端点进行聊天。

我们将使用curl。您可以看到它使用与 OpenAI API 相同的模式结构。确保您已经提取了要使用的模型。

curl http://model-runner.docker.internal/engines/llama.cpp/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "ai/llama3.2",
"messages": [
{
"role": "system",
"content": "You are a helpful assistant."
},
{
"role": "user",
"content": "Please write 100 words about the docker compose."
}
]
}'

因此,为了测试它在运行容器内部是否正常工作,我以jonlabelle/network-tools交互模式运行镜像,然后使用上面的 curl 命令与 API 通信。结果成功了。

如您所见,下面是我收到的响应。响应采用 JSON 格式,包含生成的消息、令牌使用情况、模型详细信息以及响应时间。与标准格式一致。



来自主持人

正如我之前提到的,要与 A 交互,您必须确保已启用 TCP。您可以通过访问 来验证它是否正常工作localhost:12434。您将看到一条消息,提示“Docker Model Runner。服务正在运行”。

在此示例中,我们将使用http://localhost:12434基本 URL,并遵循相同的端点。curl 命令也是如此;我们只需替换基本 URL,其他内容保持不变。

curl http://localhost:12434/engines/llama.cpp/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "ai/llama3.2",
"messages": [
{
"role": "system",
"content": "You are a helpful assistant."
},
{
"role": "user",
"content": "Please write 100 words about the docker compose."
}
]
}'

让我们在终端中运行它来尝试一下:

它将返回与另一个相同的 JSON 格式响应,包括生成的消息、令牌使用情况、模型详细信息和响应时间。



有了此 TCP 支持,我们不仅限于与容器内运行的应用程序进行交互,还可以与任何地方进行交互。



【声明】内容源于网络
0
0
索引目录
索引目录是一家专注于医疗、技术开发、物联网应用等领域的创新型公司。我们致力于为客户提供高质量的服务和解决方案,推动技术与行业发展。
内容 444
粉丝 0
索引目录 索引目录是一家专注于医疗、技术开发、物联网应用等领域的创新型公司。我们致力于为客户提供高质量的服务和解决方案,推动技术与行业发展。
总阅读838
粉丝0
内容444