首页 > 编程问答 >在 Python Langchain 应用程序的 Docker 文件中运行 Ollama

在 Python Langchain 应用程序的 Docker 文件中运行 Ollama

时间:2024-08-01 08:41:22浏览次数:12  
标签:python docker dockerfile ollama

背景信息

我有一个使用langchain 和Ollama 的Python 应用程序。在本地运行这个程序效果非常好,因为我的机器上运行着 Ollama 客户端。

我想要做的是在无服务器平台(例如 GCR)上托管这个应用程序,为了做到这一点,我需要容器化应用程序。这对于应用程序的 python 端来说很容易,但我正在努力让 Ollama 部分正确。

我需要运行 Ollama 客户端才能让 langchain 使用引擎,但我不知道如何正确执行此操作在 dockerfile 中。我尝试过多阶段构建并使用官方 Ollama docker 镜像并从源代码下载,所有这些最终都遇到了相同的问题;我将 Ollama 放到容器上,但如果我那么 RUN ollama serve 我就不能做任何其他事情,因为其余代码等待 Ollama 服务器完成。

我在运行服务器时也尝试过使用 nohup 命令,但是每当我尝试使用 ollama pull <model> 拉取模型时,它总是返回询问 Ollama 是否正在运行。我已经添加了等待,但它仍然不起作用。

我尝试使用 docker-compose.yml 文件,但我发现的示例没有满足我的需要。我尝试在 dockerfile 中使用多阶段构建来尝试首先构建 Ollama 服务器,然后在第二阶段使用它,但这会导致与在一个阶段中构建它相同的问题。

我尝试使用启动脚本并使用这些作为让容器运行的入口点,但最终会出现相同的错误,即 Ollama 无法启动并且我无法提取图像。

问题

  1. 我的第一个问题是:是否有可能实现我想做什么?将此类应用程序托管在可以安装所需软件的虚拟机上会更好吗?

  2. 我的第二个问题是:如果可能的话,是否有人做过类似的事情,可以提供一些启示或建议?

对此的任何建议或帮助将不胜感激!


当然可以,以下是如何在 Docker 容器中使用 Ollama 和 LangChain 构建 Python 应用程序的方法。关键是让 Ollama 作为后台服务运行,然后让你的 Python 应用与其交互。

Dockerfile

FROM python:3.10

# 安装系统依赖
RUN apt-get update && apt-get install -y --no-install-recommends \
    curl \
    && rm -rf /var/lib/apt/lists/*

# 安装 Ollama(使用你想要的版本替换)
RUN curl -L https://github.com/jbarham/ollama/releases/download/v0.3.10/ollama-linux-amd64.tar.gz | tar xz -C /usr/local/bin

# 为模型创建一个目录
RUN mkdir /ollama

# 将 Ollama 数据目录设置为 /ollama
ENV OLLAMA_DIR=/ollama

# 将 Ollama 作为后台服务运行
CMD ["ollama", "serve", "&"]

# 设置工作目录
WORKDIR /app

# 复制应用程序依赖
COPY requirements.txt .
RUN pip install --no-cache-dir --upgrade -r requirements.txt

# 复制应用程序代码
COPY . .

# 设置应用程序的入口点(替换为你的主脚本)
CMD ["python", "your_app.py"]

说明:

  1. 基础镜像: 我们从包含 Python 3.10 的 python:3.10 基础镜像开始。

  2. 系统依赖: 我们安装 curl (用于下载 Ollama),并且为了保持整洁,清理了 apt 缓存。

  3. 安装 Ollama:

  4. 我们从 GitHub 版本下载 Ollama 二进制文件(使用你想要的版本更新 URL)。
  5. 我们使用 tar 将其解压到 /usr/local/bin 中,使之可在系统范围内访问。

  6. 模型目录: 我们为 Ollama 模型创建一个目录( /ollama )。这将是存储模型的地方。

  7. 环境变量: 我们设置 OLLAMA_DIR=/ollama ,告诉 Ollama 在哪里存储其数据和模型。

  8. 运行 Ollama 服务器:

  9. CMD ["ollama", "serve", "&"] 以后台进程的形式启动 Ollama 服务器( & )。这确保它不会阻止后续命令。

  10. 应用程序设置: 剩余步骤设置 Python 环境并将你的应用程序代码复制到容器中,这与标准 Python Dockerfile 相同。

构建和运行:

  1. 构建 Docker 镜像: bash docker build -t my-ollama-app .

  2. 运行容器: bash docker run -p 5000:5000 -it my-ollama-app 这将在主机上的端口 5000 上公开 Ollama,并在容器内启动你的应用程序。

在你的 Python 代码( your_app.py )中:

from langchain.llms import Ollama
from langchain import PromptTemplate, LLMChain


# 在初始化 Ollama 时,无需指定 base_url,因为它在同一个容器中运行
llm = Ollama(model="llama2") 

# 现在你可以使用 Ollama 和 LangChain

其他注意事项:

  • 模型下载: 第一次运行容器时,你需要使用 docker exec -it <container_id> ollama pull llama2 等命令来拉取你想要的 Ollama 模型。
  • 持久化模型: 如果你想在容器重新启动后保留已下载的模型,请考虑使用 Docker 卷将 /ollama 目录挂载到主机上。

此设置允许你的 Python 应用程序与在同一个 Docker 容器内的 Ollama 服务器无缝通信。这让部署到 GCR 或其他无服务器平台变得更加容易。

标签:python,docker,dockerfile,ollama
From: 78522325

相关文章

  • 跟踪 VScode 中的 python 警告
    我想知道哪一行代码导致我的代码中引发警告。可以在VScode中实现吗?例如,我在终端中看到警告:目前,我只能看到在python终端中引发警告的导入模块,但我无法将其跟踪到代码的确切行,只能跟踪到该行导入模块的。也许,可以在警告上添加断点或更改某些设置,或使用扩展?以下......
  • ffmpeg python 导致死锁
    我在使用ffmpegpython处理相机帧时遇到问题。我使用process.communicate()的第一种方法效果很好,但存在延迟问题。process=(ffmpeg.input('pipe:',format='rawvideo',pix_fmt='rgb24',s='{}x{}'.format(width,height))......
  • 将 HTTP 分块编码数据流代码片段从 Node.js 转换为 Python
    我有一个Node.js客户端代码,它将请求发送到HTTP服务器,然后连续接收分块编码数据。这是带有一些流量数据输出的Node.js代码。consthttp=require('http');constoptions={hostname:'...',path:'...',port:...,...};constreq=http.request(......
  • vsc python 调试器和 pylance 无法识别已安装的包
    我最近使用snowflake-connector-python在我的虚拟环境中安装了pipinstallsnowflake-connector-python[pandas]==2.7.6,当我在激活虚拟环境的情况下从命令行运行我的脚本时,它工作正常。我设置了与VSC解释器相同的虚拟环境,但尝试运行python调试器会引发异常......
  • 如何从python读取matlab持续时间对象
    我创建一个matlab持续时间对象并将其保存到.mat文件:timeend=seconds(123);save('time.mat',timeend,'-v7.3');然后我从python读取它:withh5py.File('time.mat','r')asf:var=f['timeend'][:]print(list(var))......
  • 通过 python 连接到 Snowflake 时出错“UnpicklingError: invalid load key, '\x00'
    我在使用snowflake.connector.connect通过python连接到snowflake时遇到以下错误importsnowflake.connector#pipinstallsnowflake-connector-python#iamgettingtheenvfrom.envfileistoredlocallycnx=snowflake.connector.connect(user=os.getenv('USER'),pass......
  • Python Selenium 单击 webdriverwait 与 find_element
    我无法理解这两个代码块之间的区别。发送点击在webdriverwait和find_elements中都有效。代码1fromseleniumimportwebdriverfromselenium.webdriver.common.byimportByfromselenium.webdriver.support.uiimportWebDriverWaitfromselenium.webdriver.suppo......
  • Python 问题 如何创建在 PDF 中注册为剪切线的专色?
    我正在开发一个项目,需要我在图像周围创建一条剪切线,但在任何RIP程序(例如Versaworks或Flexi)上将其注册为实际剪切线时遇到困难。我尝试了很多不同的方法python库可以帮助解决这个问题,但我无法让它工作。我希望它像我们在Illustrator中所做的那样,创建一条名为CutConto......
  • 使用Python时如何避免`setattr`(和`getattr`)?以及是否有必要避免
    如果我想向协议缓冲区中的字段添加一个在编译时未知的值,我目前正在做setattr我通常不喜欢使用setattr,因为它看起来不太安全。但是当我知道该对象是protobuf时,我认为这很好,因为我设置它的值必须是protobuf允许的类型。所以也许它并不是真的不安全?让我举......
  • Java sshtools 生成的 EDDSA 签名与 Python 的 pycryptome 生成的签名不匹配
    我有一个python库,它使用pycryptodomelibrary使用openssh格式的ED25519私钥使用Ed25519算法对数据进行签名。然后需要使用sshtools库和相应的公钥在Java应用程序中验证签名。但是签名验证失败。约束:从文件中读取私钥/公钥很重要。我无法......