在20-30分钟后挂断,需要定期重启Ollama服务,

pdkcd3nj  于 4个月前  发布在  其他
关注(0)|答案(6)|浏览(126)

问题是什么?

我们在运行RTX-4000的GPU服务器上尝试使用Ollama,该服务器每天会收到来自后端的10000多个请求,同时最多可以并行处理2-5个请求。
不幸的是,随着时间的推移,每个请求的持续时间越来越长,最终导致进程无限挂起,消耗了200%的CPU + 100%(两个进程"ollama_lama_server",其中94%在GPU上运行)。
在此期间,由"ollama run ..."运行的新示例响应速度很快,但旧进程只是挂起。
我们在开发过程中从未遇到过这个问题,当时相同的脚本可以在48小时内无任何问题地运行。
目前,我们运行一个cronjob,每20分钟重启一次Ollama进程作为解决方法。
我们在0.3.4版本中遇到了这个问题,而在0.3.6版本中仍然存在。有人遇到过同样的问题吗?还有其他解决方法吗?
更多详细信息可以在这里找到:#6380(评论)

操作系统

Linux

GPU

Nvidia

CPU

Intel

Ollama版本

0.3.6

gzszwxb4

gzszwxb41#

服务器日志有助于调试。如果OLLAMA_NUM_PARALLEL=1,它会进入这个状态吗?CPU进程的大小是否会随着时间的推移而增加?

zqry0prt

zqry0prt2#

感谢@rick-github!
对此表示歉意——现在正在调查中

tp5buhyn

tp5buhyn3#

OLLAMA_NUM_PARALLEL=1
@rick-github 我应该在什么时候和在哪里应用这个设置?

cl25kdpy

cl25kdpy4#

我今天进行了大量测试,并在使用基于FastAPI的Python API(从Hetzner的RTX 4000)在GPU机器上运行时遇到了Ollama模型的问题。以下是详细的观察:

设置

我使用FastAPI构建了一个API,该API直接在GPU上运行uvicorn。相关的API端点如下:

@app.post("/chat", response_model=ChatResponse)
async def chat_with_model(request: ChatRequest):
    print (request)
    current_time = datetime.now().strftime("%H:%M:%S")
    print("Current Time:", current_time)

    response = ollama.chat(
        model=request.model,
        keep_alive="15m",
        format=request.format,
        messages=[message.dict() for message in request.messages]
    )

    print (response)
    current_time = datetime.now().strftime("%H:%M:%S")
    print("Current Time:", current_time)
    # Extract and parse the response content
    message_content = response['message']['content']

    print("Duration: " + response.get('total_duration', 0).__str__())

    # Creating a Message instance
    message_instance = Message(
        role=response['message']['role'],
        content=message_content
    )

    # Creating the ChatResponse instance
    chat_response = ChatResponse(
        id=str(uuid.uuid4()),
        model=response['model'],
        messages=[message_instance],
        content=message_content,
        eval_count=response.get('eval_count', 0),
        prompt_eval_count=response.get('prompt_eval_count', 0),
        prompt_eval_duration=response.get('prompt_eval_duration', 0),
        eval_duration=response.get('eval_duration', 0),
        load_duration=response.get('load_duration', 0),
        total_duration=response.get('total_duration', 0)
    )

    return chat_response
  • 注意:此代码包括调试语句,以打印时间戳进行进一步调查。*

观察

单个客户端性能:

当我运行一个客户端示例时,该客户端向API发送数千个顺序请求,系统在数小时内可靠且无问题地运行。

多个客户端性能:

当我启动其他客户端示例并并行执行请求时,问题就出现了:

  • 在启动多个客户端后,一些请求在客户端端在15秒后开始超时,尽管正常输出日志。

系统间歇性地恢复正常操作,直到我启动了第四个客户端示例。

系统死锁:

  • 在四个客户端大约10分钟后,所有API请求变得无响应且超时。
  • 当调用Ollama的聊天功能时,对API端点的新的请求会挂起。
  • 此时,gpustat显示两个ollama_lama_server进程,分别占用100%和200%的GPU资源。
  • 停止所有客户端并未解决问题;没有新的请求被处理,Ollama进程仍然处于高利用率状态。

无法终止Python应用程序:

  • 尝试终止Python应用程序失败,因为它似乎陷入了僵局,可能是在等待Ollama进程的响应。
  • 通过SSH登录到机器并通过ollama run llama3.1手动运行新示例并发出简单的“hello”命令,响应延迟但最终返回了*“你好,很高兴见到你”*。其他进程仍然处于僵持状态且“挂起”。

假设

似乎多个Ollama调用导致死锁或某种形式的资源竞争,导致进程锁定在高GPU利用率状态。此问题需要重新启动Ollama服务以恢复正常操作。

gtlvzcf8

gtlvzcf85#

OLLAMA_NUM_PARALLEL=1
@rick-github 我应该在什么时候和在哪里应用这个设置?
这取决于你是如何安装的ollama。如果你使用的是curl -fsSL https://ollama.com/install.sh | sh,那么在文件/etc/systemd/system/ollama.service的[Service]部分中添加一行Environment="OLLAMA_NUM_PARALLEL=1",然后重启服务:

sudo systemctl stop ollama
sudo systemctl daemon-reload
sudo systemctl start ollama

如果你使用的是docker,将环境变量传递给容器:

docker run -d --gpus=all --env OLLAMA_NUM_PARALLEL=1 -v ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama

如果你使用的是docker compose,将其添加到环境部分并重启(docker compose up -d ollama):

services:
  ollama:
    environment:
      - OLLAMA_NUM_PARALLEL=1
mzaanser

mzaanser6#

顺便说一下,我还发现调用ollama.chat会阻塞整个Python进程。在那段时间里,我甚至无法调用另一个端点,甚至FastAPI的"/docs"端点也无法渲染swagger文档。我们能否让它不阻塞并更异步?

相关问题