一、问题背景

在使用 Ollama 下载大模型(如 deepseek-r1:14b)时,我们常常会遇到下载速度慢的困扰。网络波动、服务器负载等多种因素都可能导致下载速度不稳定,严重影响我们的工作和学习效率。为了解决这个问题,我们可以借助 PowerShell 的强大功能,实现对下载速度的实时监控,并在速度低于设定阈值时自动中断并重新执行下载命令,以此来尝试提升整体的下载速度。

二、实现思路

整体思路是通过 PowerShell 启动 Ollama 的下载进程,然后周期性地检查下载进度,计算下载速度。一旦发现下载速度低于我们预设的阈值,就立即中断当前的下载进程,重新启动下载。不断重复这个过程,直到模型下载完成。

三、具体实现步骤

1. 环境准备

确保你的系统已经安装了 PowerShell,并且可以正常使用 Ollama 命令行工具。

2. PowerShell 脚本编写

以下是实现上述功能的 PowerShell 脚本:

# 定义速度阈值(单位:KB/秒)
$speedThreshold = 500

# 定义检查下载速度的时间间隔(单位:秒)
$checkInterval = 5

while ($true) {
    # 启动 ollama run deepseek-r1:14b 命令
    $process = Start-Process -FilePath "ollama" -ArgumentList "run deepseek-r1:14b" -PassThru -NoNewWindow

    # 假设 ollama 会在一个日志文件中记录下载进度,这里需要根据实际情况修改文件路径
    $logFilePath = "path\to\ollama.log"
    if (Test-Path $logFilePath) {
        Remove-Item $logFilePath
    }

    # 用于记录初始和最终的下载大小
    $initialSize = 0
    $finalSize = 0

    while ($true) {
        Start-Sleep -Seconds $checkInterval  # 每隔指定时间检查一次下载进度

        if (Test-Path $logFilePath) {
            $currentSize = (Get-Item $logFilePath).Length / 1KB
            if ($initialSize -eq 0) {
                $initialSize = $currentSize
            }
            $finalSize = $currentSize

            # 计算下载速度
            $downloadSpeed = ($finalSize - $initialSize) / $checkInterval

            # 判断下载速度是否低于阈值
            if ($downloadSpeed -lt $speedThreshold) {
                Write-Output "下载速度低于 $speedThreshold KB/秒,中断并重新执行。"
                Stop-Process -Id $process.Id -Force
                break  # 跳出内层循环,重新启动下载
            }
            else {
                Write-Output "下载速度正常,继续下载。"
                $initialSize = $finalSize  # 更新初始大小,为下一次计算速度做准备
            }
        }
    }

    # 检查模型是否下载完成,这里假设 ollama 有一个命令可以检查模型状态,例如:ollama list
    # 如果模型已下载完成,ollama list 会返回包含 deepseek-r1:14b 的输出,这里只是示例,实际需根据 ollama 的真实输出调整
    $modelList = & "ollama" "list"
    if ($modelList -match "deepseek-r1:14b") {
        Write-Output "模型已下载完成,停止循环。"
        break  # 跳出外层循环,结束脚本
    }
}

3. 代码解释

  • 速度阈值和检查间隔
    • $speedThreshold:我们将下载速度的阈值设定为 500KB / 秒,你可以根据实际情况进行调整。
    • $checkInterval:设定检查下载速度的时间间隔为 5 秒,这个值也可以根据需求修改。
  • 启动下载进程
    • 使用 Start-Process 启动 ollama run deepseek-r1:14b 命令,并通过 -PassThru 参数获取进程对象,方便后续中断进程。
  • 监控下载进度
    • 在一个内层 while 循环中,每隔 $checkInterval 秒检查一次下载进度。通过检查指定日志文件的大小来获取下载量,并计算下载速度。
  • 判断下载速度
    • 如果下载速度低于阈值,使用 Stop-Process 中断当前进程,并跳出内层循环,重新启动下载。
    • 如果下载速度正常,更新初始下载大小,继续监控。
  • 检查模型是否下载完成
    • 每次中断或完成内层循环后,使用 ollama list 命令检查模型是否下载完成。如果模型已下载完成,跳出外层循环,结束脚本。

4. 使用方法

        首先,你可以选择一个合适的文本编辑器,像记事本、Visual Studio Code 等。打开文本编辑器后,将上述提供的 PowerShell 代码复制进去,然后把文件保存起来,注意脚本文件的扩展名要设置为 .ps1

       接着,打开 PowerShell 终端。在终端中,使用 cd 命令来切换到你保存脚本文件的目录。例如,如果脚本文件保存在 D:\Scripts 目录下,你可以在 PowerShell 终端输入 cd D:\Scripts 并回车完成目录切换。

        目录切换完成后,直接在 PowerShell 终端输入脚本文件的名称(包含 .ps1 扩展名),然后按下回车键即可运行脚本。

        当脚本成功运行之后,它会自动对 Ollama 模型的下载过程进行监控。一旦下载速度低于设定的阈值,脚本就会自动中断当前下载并重新开始,直至模型下载完成。

5. 注意事项

  • 日志文件路径:请根据实际情况修改 $logFilePath 的值,确保指向 Ollama 记录下载进度的日志文件。
  • 模型状态检查:检查模型是否下载完成的部分使用了 ollama list 命令,你需要根据 Ollama 的实际情况进行调整。

四、总结

通过使用 PowerShell 脚本对 Ollama 模型下载速度进行监控和自动重试,我们可以在一定程度上解决下载速度慢的问题。当网络出现波动导致下载速度下降时,脚本会自动中断并重新尝试下载,从而提高整体的下载效率。希望这个方法能帮助你顺利、快速地完成 Ollama 模型的下载。

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐