windows下的ollama

windows下的ollama

ollama出来一段时间了,在mac上面跑模型的时候有时候比较卡,台式机上有独立的4060卡,想着换到上面速度能快一些,没有想到安装过程中比较曲折。

需要注意ollama调整绑定的地址和model地址都在环境变量里面配置,实例如下:

WSL

在ollama官网下载windows版本进行安装,在cmd终端中启动后可以输入,但是还是略显麻烦。正好有一个open-webui的开源项目,可以在浏览器中很方便调用ollama的服务。安装需要有容器环境,去下载dockerdesktop进行安装后竟然要登录,这网络也登录不上去啊。哎,幸好有替代的podman,去官网看安装竟然需要WSL环境,学习了。

WSL是适用于 Linux 的 Windows 子系统 (WSL) 是 Windows 的一项功能,可用于在 Windows 计算机上运行 Linux 环境,而无需单独的虚拟机或双引导。WSL 旨在为希望同时使用 Windows 和 Linux 的开发人员提供无缝高效的体验。

参考官方安装文档:

第一步安装 https://learn.microsoft.com/en-us/windows/wsl/install#step-4—download-the-linux-kernel-update-package

dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

第二步安装 https://learn.microsoft.com/en-us/windows/wsl/install-manual#step-3—enable-virtual-machine-feature

下载wsl_update_x64.msi进行安装
wsl --set-default-version 2

可以执行podman命令代表WSL和podman都装好了,可以打开PodmanDesktop进行创建容器。

open-webui

下载镜像太费劲了,直接在网络好机器上面下载好image,然后使用下面的命令方式把image导入到PC上

docker save -o [保存路径/文件名] [镜像名] 
docker load -i [文件路径]

有了镜像启动服务

打开webui,发现访问不了本地模型

在物理机上能ping通webui的IP,但在webui容器中访问不了http://192.168.1.12:11434/api/tags ollama api,比较奇怪,webui安装一些网络工具方便进行排查

 apt install procps  net-tools  iputils-ping

排查到最后发现是windows防火墙导致的,把11434、8080端口加到规则中,在webui中可以访问通ollama api了,如下:

打开webui也可以交互式使用本地模型了

把模型放到GPU上

到现在模型都是运行在CPU上,查了一下要是运行在GPU上需要安装CUDA,从官网下载对应系统版本的CUDA,重启ollama后就可以了。

测一下GPU上token的生成速度

参考https://blog.csdn.net/freewebsys/article/details/136923371博主的代码,修改一下

# coding=utf-8
"""
代码测试工具:

python3 test_throughput.py --api-address http://localhost:8000 --model-name chatglm3-6b --n-thread 10

"""
import argparse
import json
import requests
import threading
import time

def main():
    """
    主函数,用于测试API吞吐量。
    
    该函数会根据命令行参数初始化API地址、模型名称和线程数,然后创建多个线程同时向API发送请求,
    以测试API的吞吐量。函数会计算所有线程生成的单词总数,并计算每秒生成的单词数。
    """
    # 设置请求头,包括用户代理和内容类型
    headers = {"User-Agent": "openai client", "Content-Type": "application/json"}
    
    # 构建请求负载,包括模型名称、用户消息和温度参数
    ploads = {
        "model": args.model_name,
        "messages": [{"role": "user", "content": "写一个获取北京天气的Python代码"}],
        "temperature": 0.7,
    }
    
    # 获取线程API地址
    thread_api_addr = args.api_address

    def send_request(results, i):
        """
        发送请求函数。
        
        该函数由每个线程调用,向API发送请求并处理响应。函数会打印线程编号、请求的API地址、
        响应文本和生成的单词数。
        
        参数:
        - results: 用于存储所有线程结果的列表。
        - i: 线程编号。
        """
        print(f"thread {i} goes to {thread_api_addr}")
        response = requests.post(
            thread_api_addr + "/v1/chat/completions",
            headers=headers,
            json=ploads,
            stream=False,
        )
        print(response.text)
        response_new_words = json.loads(response.text)["usage"]["completion_tokens"]
        #error_code = json.loads(response.text)["error_code"]
        print(f"=== Thread {i} ===, words: {response_new_words} ")
        results[i] = response_new_words

    # use N threads to prompt the backend
    tik = time.time()
    threads = []
    results = [None] * args.n_thread
    for i in range(args.n_thread):
        t = threading.Thread(target=send_request, args=(results, i))
        t.start()
        # time.sleep(0.5)
        threads.append(t)

    for t in threads:
        t.join()

    print(f"Time (POST): {time.time() - tik} s")
    n_words = sum(results)
    time_seconds = time.time() - tik
    print(
        f"Time (Completion): {time_seconds}, n threads: {args.n_thread}, "
        f"throughput: {n_words / time_seconds} words/s."
    )

if __name__ == "__main__":
    parser = argparse.ArgumentParser()

    parser.add_argument("--api-address", type=str, default="http://192.168.1.12:11434")
    parser.add_argument("--model-name", type=str, default="qwen2.5-coder:latest")
    parser.add_argument("--n-thread", type=int, default=10)
    args = parser.parse_args()

    main()

使用qwen2.5-coder:latest  “content”: “写一个获取北京天气的Python代码” 进行测试, token的产生速度挺快的。

多模态大模型

Meta发布的LLaMA3.2 vision多模态大模型,ollama也有了https://ollama.com/library/llama3.2-vision,下来尝鲜,这个识别太赞了。

写在最后

在PC上安装podman和webui挺麻烦的,一点都不“丝滑“。极客时间12|LLaMA 3.2 Vision 将如何颠覆智能文档处理领域? 详细讲解过,llama3.2-vision 能够直接处理图片数据,理解其内容并生成自然语言描述。可以自己·基于此构建内部的智能文档处理IDP智能化业务流程。

就到这里吧,后面在工作和学习中看看如何应用这个大模型。

留下回复

error: Content is protected !!