ollama+open_webui在Ubuntu22.04上的性能优化指南:从基础安装到GPU加速配置

Ubuntu22.04服务器上基于Docker的ollama与open-webui一体化部署指南 本文详细介绍了在Ubuntu22.04服务器上使用Docker部署ollama与open-webui的完整流程,包括环境准备、GPU驱动配置、服务部署及常见问题排查。通过一体化部署指南,帮助开发者快速搭建本地AI模型运行环境,实现高效的模型推理与交互体验。 阅读详情

在Ubuntu 22.04上榨干GPU性能:Ollama与Open WebUI的深度调优实战

最近在本地部署大语言模型的朋友越来越多了,但很多人装完就发现,怎么跑起来这么慢?显存动不动就爆了?模型加载要等半天?如果你也遇到了这些问题,那今天这篇实战指南就是为你准备的。我们不只讲怎么把Ollama和Open WebUI跑起来,更要深入探讨如何让它们在你的Ubuntu 22.04服务器上发挥出GPU的全部潜力。无论你是个人开发者想搭建一个高效的本地AI工作台,还是团队需要部署一个稳定的模型推理服务,接下来的内容都会让你少走很多弯路。

1. 环境准备:不只是安装,而是优化配置

很多人一上来就直接装Docker、装驱动,但忽略了系统层面的基础优化。这些优化虽然看起来不起眼,却能显著影响后续GPU资源的利用效率。

1.1 系统层面的性能调优

Ubuntu 22.04默认的配置是为通用场景设计的,我们需要针对AI推理负载做一些调整。首先检查一下系统的交换空间(Swap),这对于处理大模型时的内存管理至关重要。

# 查看当前交换空间配置
sudo swapon --show
free -h

如果交换空间不足或者没有启用,可以考虑创建一个专用的交换文件。我一般推荐设置为物理内存的1.5到2倍,特别是当你的GPU显存较大时。

# 创建16GB的交换文件
sudo fallocate -l 16G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

# 永久生效
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

提示:交换空间虽然能防止内存不足导致的崩溃,但频繁使用会显著降低性能。理想情况下,我们应该通过合理的模型选择和参数配置来避免频繁的交换。

接下来调整系统的文件描述符限制和进程限制,这对于处理大量并发请求很重要:

# 编辑系统限制配置文件
sudo nano /etc/security/limits.conf

# 在文件末尾添加
* soft nofile 65536
* hard nofile 65536
* soft nproc 65536
* hard nproc 65536

重启后生效,这些调整能让Docker容器更好地利用系统资源。

1.2 Docker的深度配置优化

安装Docker大家都会,但如何配置才能最大化性能?这里有几个关键点:

首先是存储驱动器的选择。Ubuntu 22.04默认使用overlay2,这通常是最佳选择,但我们需要确认它是否正确配置:

# 检查当前存储驱动
docker info | grep "Storage Driver"

# 查看Docker根目录
docker info | grep "Docker Root Dir"

确保你的Docker根目录位于SSD或者高速存储设备上,如果是HDD,性能会大打折扣。

国内镜像源的配置很重要,但不仅仅是添加几个地址那么简单。我测试过多个镜像源的速度,发现不同地区、不同运营商的访问速度差异很大。建议先测试一下:

# 测试各个镜像源的下载速度(需要先安装speedtest-cli)
curl -s https://raw.githubusercontent.com/sivel/speedtest-cli/master/speedtest.py | python3 -

根据测试结果选择最快的镜像源。我的/etc/docker/daemon.json配置是这样的:

{
  "registry-mirrors": [
    "https://docker.mirrors.ustc.edu.cn",
    "https://hub-mirror.c.163.com"
  ],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  },
  "storage-driver": "overlay2",
  "storage-opts": [
    "overlay2.override_kernel_check=true"
  ]
}

注意我添加了日志配置,防止Docker日志无限增长占用磁盘空间。

Docker守护进程的资源限制也需要调整。编辑/etc/docker/daemon.json后,重启Docker服务:

sudo systemctl daemon-reload
sudo systemctl restart docker

# 验证配置生效
sudo systemctl status docker

2. GPU驱动与容器工具链的精准部署

显卡驱动的安装看似简单,实则暗藏玄机。不同的安装方式、不同的版本,对后续的容器GPU支持影响很大。

2.1 NVIDIA驱动的选择与安装

Ubuntu 22.04提供了多种安装NVIDIA驱动的方式,我强烈推荐使用官方的nvidia-driver包,而不是PPA或者.run文件:

# 首先识别你的显卡型号
lspci | grep -i nvidia

# 查看推荐的驱动版本
ubuntu-drivers devices

# 安装推荐版本(通常是最稳定的)
sudo apt install nvidia-driver-535

# 或者安装最新版本
sudo apt install nvidia-driver-545

安装完成后,重启系统并验证:

# 验证驱动安装
nvidia-smi

# 应该看到类似这样的输出
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 545.29.06              Driver Version: 545.29.06    CUDA Version: 12.3     |
|-----------------------------------------+----------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |         Memory-Usage | GPU-Util  Compute M. |
|                                         |                      |               MIG M. |
|=========================================+======================+======================|
|   0  NVIDIA GeForce RTX 4090        Off | 00000000:01:00.0 Off |                  Off |
|  0%   38C    P8              20W / 450W |      0MiB / 24564MiB |      0%      Default |
|                                         |                      |                  N/A |
+-----------------------------------------+----------------------+----------------------+

注意:如果你看到CUDA版本显示为"N/A",说明驱动安装有问题。这时候需要完全卸载重装,我建议使用sudo apt purge nvidia*清理后再重新安装。

2.2 NVIDIA Container Toolkit的配置细节

这是让Docker容器使用GPU的关键组件。安装过程虽然简单,但配置上有很多可以优化的地方:

# 添加NVIDIA容器工具包仓库
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.list | sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list

# 安装工具包
sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit

安装完成后,配置Docker使用NVIDIA运行时:

sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker

现在测试一下GPU在容器中是否可用:

# 运行一个测试容器
docker run --rm --runtime=nvidia --gpus all nvidia/cuda:12.2.2-base-ubuntu22.04 nvidia-smi

如果能看到和宿主机一样的GPU信息,说明配置成功。

这里有个重要的性能优化点:默认情况下,NVIDIA容器运行时会将所有GPU暴露给容器。如果你有多个GPU,或者想限制容器使用的GPU资源,可以这样配置:

# 只使用第一个GPU
docker run --gpus '"device=0"' ...

# 使用前两个GPU
docker run --gpus '"device=0,1"' ...

# 限制GPU内存使用(需要特定版本的驱动和工具包)
docker run --gpus '"device=0","capabilities=utility,compute,graphics,video"' --memory="8g" --memory-swap="16g" ...

3. Ollama的部署与GPU加速深度优化

Ollama的Docker部署很简单,但要让它在GPU上跑得又快又稳,就需要深入理解它的工作机制了。

3.1 Ollama容器的性能调优配置

先拉取最新的Ollama镜像:

docker pull ollama/ollama:latest

但直接运行docker run是不够的。我们需要考虑几个关键参数:

首先是持久化存储。Ollama下载的模型很大,如果不做持久化,容器重启后模型就没了。更重要的是,合理的存储配置能提升模型加载速度:

# 创建专门的存储目录
sudo mkdir -p /opt/ollama/models
sudo chmod 777 /opt/ollama/models  # 或者设置合适的权限

# 运行容器时挂载
docker run -d --gpus=all \
  --name ollama \
  -v /opt/ollama/models:/root/.ollama \
  -p 11434:11434 \
  --restart=always \
  ollama/ollama

内存和显存管理是性能优化的核心。Ollama默认会根据可用显存自动选择模型参数,但我们可以手动干预:

# 查看当前容器的资源使用情况
docker stats ollama

# 如果需要限制容器的内存使用
docker update --memory="16g" --memory-swap="32g" ollama

对于GPU显存,Ollama提供了环境变量来控制模型在显存中的保留策略:

# 保持模型始终加载在显存中(适合频繁使用的模型)
docker run -d --gpus=all \
  -e OLLAMA_KEEP_ALIVE=-1 \
  -e OLLAMA_NUM_PARALLEL=2 \
  -v /opt/ollama/models:/root/.ollama \
  -p 11434:11434 \
  --name ollama \
  ollama/ollama

OLLAMA_KEEP_ALIVE=-1表示模型永远不会从显存中卸载,这能极大提升后续推理的速度,但会占用显存。OLLAMA_NUM_PARALLEL=2允许并行处理两个请求,提高吞吐量。

3.2 模型下载与优化的实战技巧

下载模型时,很多人直接ollama run llama2就完事了,但其实有更好的方法:

# 先进入容器
docker exec -it ollama bash

# 查看可用的模型
ollama list

# 下载模型时指定参数(以Llama 2为例)
ollama pull llama2:13b

# 或者下载量化版本,节省显存
ollama pull llama2:7b-q4_0

不同的量化级别对性能和精度影响很大,这里有个简单的对比:

量化级别模型大小内存占用推理速度质量损失
q4_0最小最低最快较明显
q4_K_M较小较低快轻微
q5_K_M中等中等中等很小
q8_0较大较高较慢几乎无
原始FP16最大最高最慢无

对于大多数应用场景,q4_K_M或q5_K_M是不错的选择,在速度和精度之间取得了很好的平衡。

模型加载的优化技巧:如果你经常使用某个模型,可以创建一个启动脚本:

#!/bin/bash
# preload_models.sh
docker exec ollama ollama pull llama2:7b
docker exec ollama ollama pull mistral:7b
# 更多模型...

然后设置系统启动时自动预加载:

sudo cp preload_models.sh /etc/init.d/
sudo update-rc.d preload_models.sh defaults

3.3 高级性能监控与调优

仅仅运行起来还不够,我们需要知道它运行得怎么样。Ollama提供了监控接口:

# 查看Ollama的运行状态
curl http://localhost:11434/api/ps

# 查看模型信息
curl http://localhost:11434/api/tags

对于生产环境,我建议配置Prometheus和Grafana来监控:

# docker-compose.yml片段
version: '3.8'
services:
  ollama:
    image: ollama/ollama:latest
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: all
              capabilities: [gpu]
    ports:
      - "11434:11434"
    volumes:
      - ollama_data:/root/.ollama
    environment:
      - OLLAMA_KEEP_ALIVE=-1
      - OLLAMA_HOST=0.0.0.0
    restart: unless-stopped

  prometheus:
    image: prom/prometheus:latest
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
    ports:
      - "9090:9090"

  grafana:
    image: grafana/grafana:latest
    ports:
      - "3000:3000"

对应的Prometheus配置需要收集Ollama的指标(如果Ollama暴露了metrics端点的话)。

4. Open WebUI的部署与生产级优化

Open WebUI提供了一个漂亮的Web界面来与Ollama交互,但它的部署也有不少讲究。

4.1 生产环境部署配置

直接运行Docker命令很简单,但生产环境需要考虑更多:

# 基础运行命令
docker run -d \
  -p 8080:8080 \
  --gpus all \
  -v open-webui:/app/backend/data \
  --name open-webui \
  --restart always \
  ghcr.io/open-webui/open-webui:main

但这还不够。我们需要考虑:

数据持久化:虽然用了-v open-webui:/app/backend/data,但这是Docker卷,备份和迁移不方便。我更喜欢绑定挂载到主机目录:

# 创建数据目录
sudo mkdir -p /opt/open-webui/data
sudo chmod 777 /opt/open-webui/data

docker run -d \
  -p 8080:8080 \
  --gpus all \
  -v /opt/open-webui/data:/app/backend/data \
  --add-host=host.docker.internal:host-gateway \
  -e OLLAMA_BASE_URL=http://host.docker.internal:11434 \
  --name open-webui \
  --restart always \
  ghcr.io/open-webui/open-webui:main

网络配置:注意--add-host=host.docker.internal:host-gateway这个参数,它让容器能够访问宿主机的服务。这样Open WebUI就能连接到同样运行在宿主机上的Ollama服务。

资源限制:Open WebUI本身不消耗太多资源,但在生产环境中还是应该限制一下:

docker update \
  --memory="2g" \
  --memory-swap="4g" \
  --cpus="1.0" \
  open-webui

4.2 安全性与访问控制优化

默认情况下,Open WebUI的第一个注册用户是管理员,但这在生产环境中不够安全。

环境变量配置:Open WebUI支持很多环境变量来增强安全性:

docker run -d \
  -p 8080:8080 \
  --gpus all \
  -v /opt/open-webui/data:/app/backend/data \
  -e ENABLE_SIGNUP=false \  # 禁用注册,只能通过已有账户登录
  -e DEFAULT_MODELS="llama2, mistral" \  # 设置默认可用模型
  -e ANONYMIZED_TELEMETRY=false \  # 禁用遥测
  --name open-webui \
  ghcr.io/open-webui/open-webui:main

反向代理配置:直接暴露8080端口不安全,应该用Nginx做反向代理并配置SSL:

# /etc/nginx/sites-available/open-webui
server {
    listen 80;
    server_name ai.yourdomain.com;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    server_name ai.yourdomain.com;
    
    ssl_certificate /etc/letsencrypt/live/ai.yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/ai.yourdomain.com/privkey.pem;
    
    location / {
        proxy_pass http://localhost:8080;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        
        # 超时设置
        proxy_connect_timeout 60s;
        proxy_send_timeout 60s;
        proxy_read_timeout 60s;
    }
    
    # 限制上传文件大小
    client_max_body_size 100M;
}

身份验证集成:如果需要更严格的控制,可以集成OAuth或LDAP:

# 使用Keycloak作为OAuth提供者
docker run -d \
  -p 8080:8080 \
  -e AUTH_PROVIDER="keycloak" \
  -e KEYCLOAK_URL="https://keycloak.yourdomain.com" \
  -e KEYCLOAK_REALM="open-webui" \
  -e KEYCLOAK_CLIENT_ID="open-webui-client" \
  -e KEYCLOAK_CLIENT_SECRET="your-client-secret" \
  --name open-webui \
  ghcr.io/open-webui/open-webui:main

4.3 性能监控与日志管理

Open WebUI的日志默认输出到控制台,我们需要配置日志轮转和持久化:

# 使用Docker的日志驱动
docker run -d \
  --log-driver=json-file \
  --log-opt max-size=10m \
  --log-opt max-file=3 \
  # ... 其他参数

对于生产环境,建议将日志收集到集中式系统:

# 使用Fluentd收集日志
docker run -d \
  --log-driver=fluentd \
  --log-opt fluentd-address=localhost:24224 \
  --log-opt tag="open-webui" \
  # ... 其他参数

性能监控:Open WebUI提供了健康检查端点:

# 健康检查
curl http://localhost:8080/health

# 就绪检查
curl http://localhost:8080/ready

可以在Docker Compose或Kubernetes中配置健康检查:

healthcheck:
  test: ["CMD", "curl", "-f", "http://localhost:8080/health"]
  interval: 30s
  timeout: 10s
  retries: 3
  start_period: 40s

4.4 高级功能与自定义配置

Open WebUI支持很多自定义配置,通过环境变量或配置文件:

模型管理优化:可以预设一些常用的模型配置:

# 设置默认模型参数
docker run -d \
  -e DEFAULT_MODEL="llama2:7b" \
  -e DEFAULT_TEMPERATURE="0.7" \
  -e DEFAULT_MAX_TOKENS="2048" \
  -e DEFAULT_TOP_P="0.9" \
  # ... 其他参数

UI自定义:可以修改WebUI的外观和行为:

# 自定义主题和品牌
docker run -d \
  -e WEBUI_NAME="My AI Assistant" \
  -e WEBUI_LOGO_URL="https://example.com/logo.png" \
  -e PRIMARY_COLOR="#3b82f6" \
  -e SECONDARY_COLOR="#1e40af" \
  # ... 其他参数

插件系统:Open WebUI支持插件扩展功能。虽然官方插件还不多,但可以自己开发或使用社区插件:

# 启用实验性功能(可能需要特定版本)
docker run -d \
  -e ENABLE_EXPERIMENTAL_FEATURES=true \
  # ... 其他参数

5. 系统级性能调优与故障排除

即使各个组件都配置好了,整个系统可能还是没有达到最佳性能。这时候需要从系统层面进行调优。

5.1 Linux内核参数优化

对于AI推理负载,有几个内核参数特别重要:

# 编辑sysctl配置
sudo nano /etc/sysctl.conf

# 添加或修改以下参数
# 增加TCP连接缓冲区大小
net.core.rmem_max = 134217728
net.core.wmem_max = 134217728
net.ipv4.tcp_rmem = 4096 87380 134217728
net.ipv4.tcp_wmem = 4096 65536 134217728

# 增加文件描述符限制
fs.file-max = 2097152
fs.nr_open = 2097152

# 减少TCP TIME-WAIT时间,快速回收端口
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_tw_reuse = 1

# 增加网络连接跟踪表大小
net.netfilter.nf_conntrack_max = 524288

# 应用配置
sudo sysctl -p

GPU特定的优化:NVIDIA驱动也有一些隐藏参数可以调整:

# 查看当前GPU设置
nvidia-smi -q

# 设置持久化模式(GPU在无负载时也不降频)
sudo nvidia-smi -pm 1

# 设置GPU应用时钟(需要特定GPU支持)
sudo nvidia-smi -ac 5001,1860  # 设置内存和GPU时钟频率

5.2 存储性能优化

模型加载速度很大程度上取决于存储性能。如果使用机械硬盘,建议至少将模型目录放在SSD上。

使用RAM磁盘加速:对于频繁访问的小模型,可以放在RAM磁盘中:

# 创建4GB的RAM磁盘
sudo mkdir /mnt/ramdisk
sudo mount -t tmpfs -o size=4g tmpfs /mnt/ramdisk

# 将Ollama的模型缓存指向RAM磁盘
docker run -d \
  --gpus=all \
  -v /mnt/ramdisk:/root/.ollama/cache \
  -v /opt/ollama/models:/root/.ollama/models \
  # ... 其他参数

使用bcache或LVM缓存:如果既有SSD又有HDD,可以用bcache将SSD作为HDD的缓存:

# 安装bcache工具
sudo apt install bcache-tools

# 创建缓存设备(假设/dev/sdb是SSD,/dev/sdc是HDD)
sudo make-bcache -C /dev/sdb -B /dev/sdc

5.3 监控与告警系统

生产环境必须要有监控。除了前面提到的Prometheus,还可以配置更详细的监控:

GPU监控:使用DCGM(Data Center GPU Manager)获取更详细的GPU指标:

# 安装DCGM
docker run -d \
  --gpus all \
  --name dcgm-exporter \
  -p 9400:9400 \
  nvcr.io/nvidia/k8s/dcgm-exporter:3.2.6-3.1.5-ubuntu22.04

自定义监控脚本:写一个简单的脚本来监控关键指标:

#!/bin/bash
# monitor_ai_stack.sh

# 检查Ollama服务
if ! curl -s http://localhost:11434/api/tags > /dev/null; then
    echo "Ollama服务异常" | mail -s "AI服务告警" admin@example.com
fi

# 检查GPU状态
GPU_UTIL=$(nvidia-smi --query-gpu=utilization.gpu --format=csv,noheader,nounits | head -1)
if [ "$GPU_UTIL" -gt 90 ]; then
    echo "GPU使用率超过90%:${GPU_UTIL}%" | mail -s "GPU高负载告警" admin@example.com
fi

# 检查显存使用
GPU_MEMORY=$(nvidia-smi --query-gpu=memory.used --format=csv,noheader,nounits | head -1)
GPU_MEMORY_TOTAL=$(nvidia-smi --query-gpu=memory.total --format=csv,noheader,nounits | head -1)
MEMORY_PERCENT=$((GPU_MEMORY * 100 / GPU_MEMORY_TOTAL))

if [ "$MEMORY_PERCENT" -gt 95 ]; then
    echo "GPU显存使用超过95%" | mail -s "显存告警" admin@example.com
fi

设置cron定时任务:

# 每5分钟运行一次
*/5 * * * * /path/to/monitor_ai_stack.sh

5.4 常见问题与解决方案

在实际部署中,我遇到过各种各样的问题。这里分享几个最常见的:

问题1:Ollama容器启动失败,提示GPU不可用

# 错误信息类似:
# docker: Error response from daemon: could not select device driver "" with capabilities: [[gpu]].

解决方案:

  1. 确认NVIDIA Container Toolkit已正确安装:nvidia-ctk --version
  2. 重启Docker服务:sudo systemctl restart docker
  3. 检查运行时配置:sudo nvidia-ctk runtime configure --runtime=docker --force
  4. 验证GPU在容器中可用:docker run --rm --runtime=nvidia --gpus all nvidia/cuda:12.2.2-base-ubuntu22.04 nvidia-smi

问题2:模型下载速度极慢

解决方案:

  1. 使用国内镜像源(如果在中国):
    # 在容器内设置代理
    docker exec -it ollama bash
    export https_proxy=http://your-proxy:port
    export http_proxy=http://your-proxy:port
    
  2. 或者直接使用预下载的模型文件:
    # 手动下载模型文件
    wget https://example.com/models/llama2-7b-q4_0.gguf
    # 复制到Ollama模型目录
    cp llama2-7b-q4_0.gguf /opt/ollama/models/
    

问题3:推理速度突然变慢

解决方案:

  1. 检查GPU温度:nvidia-smi -q -d temperature
  2. 检查是否有其他进程占用GPU:nvidia-smi
  3. 检查系统内存和交换空间使用:free -h
  4. 重启Ollama容器:docker restart ollama

问题4:Open WebUI无法连接到Ollama

解决方案:

  1. 检查网络配置,确保使用了正确的--add-host参数
  2. 检查Ollama是否在运行:docker ps | grep ollama
  3. 检查端口是否开放:netstat -tlnp | grep 11434
  4. 在Open WebUI容器内测试连接:
    docker exec open-webui curl http://host.docker.internal:11434/api/tags
    

6. 进阶优化:多模型管理与自动扩缩容

当你的应用越来越复杂,可能需要同时管理多个模型,或者根据负载自动调整资源。

6.1 多模型并行服务配置

有时候我们需要同时提供多个模型的服务,或者为不同用户分配不同的模型。Ollama本身支持同时运行多个模型实例:

# 启动多个Ollama实例,每个使用不同的端口
docker run -d --gpus=all \
  -p 11435:11434 \
  -v /opt/ollama/models1:/root/.ollama \
  --name ollama-llama \
  ollama/ollama

docker run -d --gpus=all \
  -p 11436:11434 \
  -v /opt/ollama/models2:/root/.ollama \
  --name ollama-mistral \
  ollama/ollama

然后在Open WebUI中配置多个后端:

# 启动Open WebUI时指定多个Ollama后端
docker run -d \
  -p 8080:8080 \
  -e OLLAMA_BASE_URLS="http://host.docker.internal:11435,http://host.docker.internal:11436" \
  --name open-webui \
  ghcr.io/open-webui/open-webui:main

这样用户就可以在WebUI中选择使用哪个模型后端了。

6.2 基于负载的自动扩缩容

对于生产环境,我们可以使用简单的脚本实现基于GPU使用率的自动扩缩容:

#!/usr/bin/env python3
# auto_scaler.py

import subprocess
import json
import time
import logging

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

def get_gpu_utilization():
    """获取GPU使用率"""
    try:
        result = subprocess.run(
            ['nvidia-smi', '--query-gpu=utilization.gpu', '--format=csv,noheader,nounits'],
            capture_output=True, text=True
        )
        utilizations = [int(x.strip()) for x in result.stdout.strip().split('\n')]
        return max(utilizations) if utilizations else 0
    except Exception as e:
        logger.error(f"获取GPU使用率失败: {e}")
        return 0

def get_ollama_instances():
    """获取当前运行的Ollama实例数量"""
    try:
        result = subprocess.run(
            ['docker', 'ps', '--filter', 'name=ollama', '--format', '{{.Names}}'],
            capture_output=True, text=True
        )
        instances = result.stdout.strip().split('\n')
        return len([i for i in instances if i])
    except Exception as e:
        logger.error(f"获取Ollama实例失败: {e}")
        return 0

def scale_ollama_instances(target_count):
    """调整Ollama实例数量"""
    current_count = get_ollama_instances()
    
    if target_count > current_count:
        # 需要扩容
        for i in range(current_count, target_count):
            port = 11434 + i
            logger.info(f"启动Ollama实例,端口: {port}")
            subprocess.run([
                'docker', 'run', '-d', '--gpus=all',
                '-p', f'{port}:11434',
                '-v', f'/opt/ollama/models{i}:/root/.ollama',
                '--name', f'ollama-instance-{i}',
                'ollama/ollama'
            ])
    elif target_count < current_count:
        # 需要缩容
        for i in range(current_count - 1, target_count - 1, -1):
            logger.info(f"停止Ollama实例: ollama-instance-{i}")
            subprocess.run(['docker', 'stop', f'ollama-instance-{i}'])
            subprocess.run(['docker', 'rm', f'ollama-instance-{i}'])

def main():
    """主循环,每30秒检查一次"""
    while True:
        gpu_util = get_gpu_utilization()
        current_instances = get_ollama_instances()
        
        logger.info(f"当前GPU使用率: {gpu_util}%,运行实例: {current_instances}")
        
        # 简单的扩缩容逻辑
        if gpu_util > 80 and current_instances < 3:  # GPU使用率高,增加实例
            scale_ollama_instances(current_instances + 1)
        elif gpu_util < 30 and current_instances > 1:  # GPU使用率低,减少实例
            scale_ollama_instances(current_instances - 1)
        
        time.sleep(30)

if __name__ == '__main__':
    main()

这个脚本会监控GPU使用率,当使用率超过80%时增加Ollama实例,低于30%时减少实例。当然,实际生产环境可能需要更复杂的逻辑。

6.3 模型预热与缓存策略

为了减少用户等待时间,可以实现模型预热机制:

#!/bin/bash
# model_warmup.sh

# 预加载常用模型
MODELS=("llama2:7b" "mistral:7b" "qwen2:7b")

for model in "${MODELS[@]}"; do
    echo "预热模型: $model"
    # 在每个Ollama实例中预加载
    for i in {0..2}; do
        port=$((11434 + i))
        if curl -s "http://localhost:$port/api/ps" | grep -q "$model"; then
            echo "实例$port已加载$model"
        else
            echo "在实例$port中加载$model"
            curl -X POST "http://localhost:$port/api/generate" \
                -H "Content-Type: application/json" \
                -d "{\"model\": \"$model\", \"prompt\": \"Hello\", \"stream\": false}"
        fi
    done
done

# 定期保持模型活跃
while true; do
    for i in {0..2}; do
        port=$((11434 + i))
        curl -s "http://localhost:$port/api/tags" > /dev/null
    done
    sleep 300  # 每5分钟检查一次
done

这个脚本会在系统启动时预加载常用模型,并定期发送心跳请求保持模型活跃。

7. 成本优化与资源管理

最后,对于长期运行的服务,成本优化也很重要。特别是电费和云服务费用。

7.1 功耗管理与节能配置

GPU在空闲时也会消耗不少电力。我们可以配置自动休眠:

# 设置GPU自动降频
sudo nvidia-smi -pm 1  # 启用持久化模式
sudo nvidia-smi -ac 300,1000  # 设置较低的时钟频率(需要GPU支持)

# 使用nvidia-settings调整功耗限制
sudo nvidia-smi -pl 200  # 将功耗限制在200W(根据你的GPU调整)

# 监控GPU功耗
watch -n 1 nvidia-smi --query-gpu=power.draw --format=csv,noheader,nounits

对于不常用的模型,可以设置自动卸载:

#!/bin/bash
# auto_unload_models.sh

# 检查模型最后使用时间
check_model_usage() {
    model=$1
    port=${2:-11434}
    
    # 这里需要根据你的日志系统实现
    # 假设有一个API可以获取模型最后使用时间
    last_used=$(curl -s "http://localhost:$port/api/model/$model/last_used")
    current_time=$(date +%s)
    
    # 如果超过1小时未使用,卸载模型
    if [ $((current_time - last_used)) -gt 3600 ]; then
        echo "卸载模型: $model"
        curl -X DELETE "http://localhost:$port/api/model/$model"
    fi
}

# 定期检查所有模型
while true; do
    for port in 11434 11435 11436; do
        models=$(curl -s "http://localhost:$port/api/tags" | jq -r '.models[].name')
        for model in $models; do
            check_model_usage "$model" "$port"
        done
    done
    sleep 600  # 每10分钟检查一次
done

7.2 存储优化与清理

模型文件很大,需要定期清理不再使用的模型:

#!/bin/bash
# cleanup_models.sh

# 保留最近7天使用的模型,删除其他
find /opt/ollama/models -name "*.gguf" -type f -mtime +7 -delete

# 清理Docker无用资源
docker system prune -af

# 清理未使用的镜像
docker image prune -af

# 清理构建缓存
docker builder prune -af

设置cron任务定期清理:

# 每天凌晨3点清理
0 3 * * * /path/to/cleanup_models.sh

7.3 监控与成本分析

最后,建立一个简单的成本监控系统:

#!/usr/bin/env python3
# cost_monitor.py

import subprocess
import time
import json
from datetime import datetime

def get_gpu_power():
    """获取GPU功耗"""
    try:
        result = subprocess.run(
            ['nvidia-smi', '--query-gpu=power.draw', '--format=csv,noheader,nounits'],
            capture_output=True, text=True
        )
        power = float(result.stdout.strip())
        return power
    except:
        return 0

def calculate_cost(power_watts, hours, cost_per_kwh=0.15):
    """计算电费成本"""
    kwh = power_watts * hours / 1000
    return kwh * cost_per_kwh

def main():
    total_power = 0
    samples = 0
    start_time = time.time()
    
    try:
        while True:
            power = get_gpu_power()
            total_power += power
            samples += 1
            
            if samples % 60 == 0:  # 每分钟记录一次
                avg_power = total_power / samples
                elapsed_hours = (time.time() - start_time) / 3600
                cost = calculate_cost(avg_power, elapsed_hours)
                
                log_entry = {
                    'timestamp': datetime.now().isoformat(),
                    'avg_power_watts': round(avg_power, 2),
                    'elapsed_hours': round(elapsed_hours, 2),
                    'estimated_cost_usd': round(cost, 2)
                }
                
                with open('/var/log/gpu_cost.log', 'a') as f:
                    f.write(json.dumps(log_entry) + '\n')
                
                print(f"平均功耗: {avg_power:.1f}W, 运行时间: {elapsed_hours:.1f}h, 预估电费: ${cost:.2f}")
            
            time.sleep(1)
            
    except KeyboardInterrupt:
        print("\n监控结束")
        avg_power = total_power / samples if samples > 0 else 0
        elapsed_hours = (time.time() - start_time) / 3600
        cost = calculate_cost(avg_power, elapsed_hours)
        print(f"总运行时间: {elapsed_hours:.1f}小时")
        print(f"平均功耗: {avg_power:.1f}W")
        print(f"总预估电费: ${cost:.2f}")

if __name__ == '__main__':
    main()

这个脚本会持续监控GPU功耗,并估算电费成本。你可以根据自己的电价调整cost_per_kwh参数。

我在自己的RTX 4090上跑了这个监控,发现即使是在相对空闲的状态(只加载了模型,没有推理请求),GPU也会消耗大约50W的功率。如果24小时不间断运行,一个月电费大概在5-6美元左右。当进行密集推理时,功耗会上升到300-400W,这时候的成本就相当可观了。所以对于个人使用,我一般会在不用的时候手动停止服务,或者设置一个自动休眠的时间表。

2025本地AI图形界面选型指南:Ollama、LM Studio与Open WebUI实战对比 本地大模型图形界面(GUI)是实现离线AI应用的关键入口,其本质是将复杂推理引擎转化为用户可操作的交互系统。核心原理在于对模型运行时、通信协议和用户意图的三层翻译,技术价值体现在隐私保障、硬件适配与工作流整合能力。典型应用场景包括离线写作辅助、合同智能审查及个性化教育生成等。本文基于实测数据,深度解析Ollama的极简服务化设计、LM Studio的Windows全栈集成优势,以及Open WebUI的企业级RAG与多模型编排能力,聚焦真实部署中的权限陷阱、量化误判、沙箱机制与性能调优等关键细节。 阅读详情

相关推荐

本地部署Llama3 8B大模型:Ollama实战指南与性能优化

大语言模型(LLM)作为人工智能领域的核心技术,通过海量参数模拟人类语言理解与生成能力。其工作原理基于Transformer架构,通过自注意力机制处理序列数据,实现上下文感知的文本生成。这项技术的核心价值在于将强大的自然语言处理能力泛化到各类下游任务,如代码生成、文档总结和逻辑推理。在实际应用中,本地部署成为平衡性能、隐私与成本的关键场景,尤其适合开发者和研究者进行私有化AI助手构建。本文聚焦于使用Ollama工具链在消费级硬件上部署Meta开源的Llama3 8B模型,涵盖从驱动配置、模型量化到WebUI

weixin_34195364的博客 322

Open WebUI GPU加速:CUDA环境配置指南

你是否还在为本地部署的AI模型响应缓慢而烦恼?当处理复杂对话或大语言模型时,CPU计算往往力不从心。本文将带你通过3个简单步骤完成Open WebUI的CUDA环境配置,让模型推理速度提升5-10倍,彻底告别等待焦虑。读完本文你将获得:GPU加速环境检查清单、Docker一键部署方案、性能验证工具及常见问题解决方案。 ## 为什么需要GPU加速? 大型语言模型(LLM)的推理过程涉及数十亿参数...

gitblog_00825的博客 1775

零基础本地部署AI大模型:从硬件检查到Ollama一键运行全指南

人工智能大模型已成为当前技术发展的核心驱动力,其背后依赖深度学习框架与GPU加速计算。理解大模型本地部署的原理,关键在于掌握模型量化、显存管理与计算图优化等技术,这些技术能显著降低资源消耗并提升推理效率。对于开发者、研究人员及隐私敏感型用户而言,本地部署的价值在于实现数据完全私有化、摆脱网络与API限制,并能进行深度定制与持续学习。在实际应用场景中,无论是个人知识库问答、代码辅助生成还是内部文档分析,本地化AI都能提供稳定、可控的服务。本文聚焦于通过Ollama这一现代化工具链,结合CUDA环境配置与模型拉

weixin_30614109的博客 329

Ollama云服务器部署保姆级教程:从选型到Open WebUI全流程

大模型推理正从科研走向工程化实践,而私有化部署成为开发者与中小企业关注的热点。在众多推理框架中,Ollama凭借开箱即用的二进制封装、自动化的量化处理以及OpenAI兼容的HTTP API,大幅降低了本地与云端运行大模型的门槛。本文从云环境部署的基本概念出发,讲解硬件选型、系统配置、模型拉取与远程访问等核心原理,并结合安全加固、反向代理与可视化界面搭建等工程实践,覆盖GPU直通、内存优化、下载加速等真实场景中的技术要点。无论你是想低成本体验智能对话,还是需要在团队内网快速搭建推理服务,这套基于Ollama的

weixin_29042035的博客 279

Ollama实战:Qwen2大模型本地部署与性能优化指南

本文详细介绍了如何在本地使用Ollama部署阿里通义千问Qwen2大模型,并提供了从安装配置、GPU加速到性能优化的完整实战指南。文章重点解析了如何通过Ollama简化部署流程,针对不同硬件选择合适模型版本,并利用参数调优与量化技术提升运行效率,最终实现将本地模型接入API服务与应用生态,打造私有化AI助手。

weixin_28312391的博客 208

Ollama本地大模型部署指南:从零搭建私有AI服务

大型语言模型(LLM)作为当前人工智能领域的核心技术,其部署方式正从云端API向本地私有化迁移,以满足数据隐私、成本控制和定制化需求。本地部署的核心原理在于通过量化、硬件适配等技术,在消费级硬件上高效运行模型推理。Ollama框架正是这一趋势下的代表性工具,它封装了模型管理、服务部署等复杂流程,提供开箱即用的体验。其技术价值在于大幅降低了本地化部署门槛,通过GGUF模型格式和OpenAI API兼容设计,使开发者能快速集成AI能力到现有应用。在应用场景上,本地大模型特别适合数据敏感行业、离线环境、定制化AI

weixin_34335458的博客 366

保姆级教程:在Ubuntu 22.04上,用Docker和NVIDIA GPU加速你的本地AI聊天室(Open WebUI + Ollama)

本文提供了一份详细的Ubuntu 22.04系统上使用Docker和NVIDIA GPU加速部署本地AI聊天室的保姆级教程。通过Open WebUI和Ollama的组合,实现高性能的本地AI对话体验,特别强调GPU加速配置和性能优化技巧,适合开发者快速搭建高效的AI应用环境。

weixin_29201313的博客 357

Ollama本地部署ChatGPT:一键运行大模型的实操指南

大语言模型(LLM)本地化运行正成为开发者与职场人的刚需,其核心在于降低部署门槛、保障数据隐私并实现离线可用。Ollama作为轻量级模型运行时,通过自包含二进制、OpenAI兼容API和智能镜像分发机制,将传统需配置CUDA、编译依赖、手动下载GGUF的复杂流程,简化为单命令启动。它不替代云服务,而是提供稳定、可控、零API调用成本的终端侧推理能力,广泛适用于代码辅助、文档处理、教学演示及私有知识库构建等场景。本文聚焦Ollama在国内环境下的高效安装、镜像加速、Metal/GPU优化及Open WebUI

weixin_34343308的博客 402

Ubuntu 24.04本地AI开发环境搭建:Open WebUI与Ollama实战

本地AI开发环境搭建是当前人工智能技术落地的关键环节,其核心在于实现模型的高效部署与可视化交互。通过Ubuntu系统的基础环境配置,结合Ollama的模型管理能力和Open WebUI的交互界面,开发者可以快速构建私有化AI服务。这种方案特别适合需要数据隐私保护的场景,如医疗、金融等行业。技术实现上,CUDA加速和GPU资源管理是性能优化的重点,而Open WebUI的RAG文档检索等扩展功能则大幅提升了实用价值。本方案在RTX 3060及以上显卡设备实测中,可流畅运行Llama3-8B等主流开源大模型。

weixin_30883311的博客 379

本地部署DeepSeek-R1:从零搭建私有AI助手的完整指南

大语言模型(LLM)通过海量数据训练获得强大的自然语言理解和生成能力,其核心原理基于Transformer架构的注意力机制。在工程实践中,模型量化技术能显著降低硬件门槛,将数十亿参数模型适配到消费级GPU。本地部署方案的价值在于实现数据隐私可控、成本可预测,并能深度定制模型行为。对于代码生成、技术问答等应用场景,开源模型DeepSeek-R1展现出优秀的推理能力。本文聚焦Ollama框架与Open WebUI工具链,详解如何通过模型量化策略在有限显存环境下部署AI助手,并解决GPU显存优化、API服务配置等

weixin_34072458的博客 405

力软敏捷开发框架源码7.0.6旗舰版 JNPF开发平台3.4.5 企业版 旗舰版

JNPF作为作为一款深受用户喜爱的低代码产品,凭借雄厚的科研技术力量、丰富的软件开发项目经验、严谨的项目开发流程和高质量的售后服务,已成功帮助千家企业完成数字化项目,建立了覆盖不同行业客户和不同发展阶段的软件产品服务体系。

huoooos0的博客 1839

Ubuntu 22.04下AI服务全栈部署指南

AI服务部署是当前开发者和技术团队的重要需求,特别是在本地服务器或开发机上搭建完整的AI应用环境。Ubuntu 22.04 LTS作为稳定的Linux发行版,结合Ollama的模型管理能力和DeepSeek的高性能推理框架,可以构建生产级可用的AI服务栈。这种架构在资源利用率、响应速度和隐私保护方面具有明显优势,特别适合中小规模应用场景。通过容器化技术如Docker,可以更好地隔离依赖关系,提升部署效率。本文详细介绍了从基础环境准备到模型管理、推理框架集成以及WebUI部署的全流程,帮助开发者快速搭建高效的

weixin_30535843的博客 326

APM无人船测绘实战:从RTK、测深仪到图传的完整系统集成指南

本文提供了一套完整的APM无人船测绘系统集成实战指南。从RTK模块配置、测深仪数据同步到图传系统接入,详细解析了硬件选型、接线、软件参数调试及QGC地面站任务规划的全流程,旨在帮助用户将分散的部件整合为可自主执行水下地形测绘的可靠工具。

rr23456的博客 520

本地部署大语言模型:Ollama+Open WebUI实战指南

大语言模型(Large Language Model)作为当前AI领域的重要突破,其部署方式正从云端向本地延伸。通过Docker容器化技术实现环境隔离,结合Ollama提供的模型管理框架,开发者可以在个人电脑上高效运行Llama2、Mistral等主流开源模型。这种方案特别适合需要数据隐私保护的场景,如企业内部知识库构建、敏感数据处理等。Open WebUI组件则提供了类似ChatGPT的交互界面,大幅降低了大模型的使用门槛。在硬件配置方面,从8GB内存的轻薄本到配备RTX4090的高性能设备都能找到合适的

weixin_33690963的博客 431

Word公式一键转MathType保姆级教程(附omml2mml.xsl报错终极解决方案)

本文提供Word公式一键转MathType的保姆级教程,重点解决常见的omml2mml.xsl报错问题。通过详细分析报错原因、官方解决方案实操步骤及转换后格式优化技巧,帮助用户高效完成公式转换,适用于科研论文和商业文档编辑。

weixin_30082367的博客 547

波束成形(Beamforming)详解

波束成形(Beamforming)是一种智能天线技术,通过调整天线阵列的相位和幅度,使信号在特定方向上增强,同时抑制干扰,提高通信性能。根据实现方式,可分为固定波束成形和自适应波束成形;按计算方式,则包括模拟、数字和混合波束成形。该技术在 5G/6G、毫米波通信、MIMO、车联网、卫星通信 等领域广泛应用。其关键技术包括 相控阵、预编码、波束扫描和波束跟踪。未来,结合 AI、超大规模 MIMO(XL-MIMO)和太赫兹通信,波束成形将在无线通信、智能交通、环境感知等领域发挥核心作用。

斯黄人民的博客 2382

企业级AI平台容器化部署:Open WebUI深度实践指南

Open WebUI作为一款功能丰富、可完全离线运行的自托管AI平台,为企业技术决策者和运维工程师提供了完整的AI交互解决方案。这款开源的AI Web界面支持Ollama、OpenAI兼容API等多种大语言模型运行器,通过容器化部署能够快速构建稳定高效的企业AI服务平台,实现本地化AI能力部署和私有化AI应用管理。 [![Open WebUI AI界面展示](https://raw.gitcod

gitblog_00812的博客 1028

适航文章汇总:知识体系全面梳理

无论您是行业新手还是经验丰富的专业人士,都可以通过本篇文章快速查找相关资料,提高对适航认证、机载系统、软件及硬件等领域的理解。本部分详细解析ARP 4754A、ARP 4761、DO-178C、DO-254等核心标准,并介绍其在机载系统开发中的应用。介绍FAA、EASA、CCAR等主要航空管理机构的适航规章体系,并说明各类飞行器(如固定翼、旋翼机、无人机等)的适航要求。本部分还探讨硬件设计、验证与确认过程中的挑战。从系统架构设计到机载设备的集成与管理,本部分介绍机载系统的研发体系及适航管理的最佳实践。

qq_41854911的博客 1448

Docker+Ollama+Open WebUI:三件套本地部署LLaMA-3大模型实战指南

容器化技术通过Docker实现环境隔离与依赖管理,解决了软件部署中常见的版本冲突与环境不一致问题。结合GPU加速与CUDA生态,容器技术能够高效利用硬件资源进行高性能计算。在AI模型部署领域,Ollama作为轻量级模型管理引擎,采用GGUF量化格式显著降低显存占用,使得大语言模型能在消费级硬件上运行。Open WebUI则提供了开箱即用的Web交互界面,将模型API封装成类ChatGPT的友好体验。这套技术组合特别适用于需要数据隐私保护的本地化AI应用场景,例如个人代码辅助、文档分析与私有知识库构建。本文以

weixin_30566111的博客 373

wireshark提取视频数据之RTP包中提取H264和H265

本文主要描述从wireshark包数据中提取出H264和H265裸流数据方法,裸流通过RTP封包方式发送,从抓包中直接提取视频流数据,进而进行流媒体问题定位

技术控的笔记 17万+

深入C++学习还必须掌握的一基础知识精讲

施磊C++语言基础提高课程笔记,包括了new/delete;malloc/free;引用和指针;const,指计和引用的结合;函数重载,inline的数,参数带默认值的函数;函数模板等知识点

GeniusAng的博客 1477

如何在GPU服务器上安装DeepSeek-R1大模型?

DeepSeek-R1是一款专为复杂推理、编程、数学和问题解决设计的开源AI模型。它采用混合专家(MoE)架构,能动态分配资源给不同的专家子模型,在保持高性能的同时显著提升效率。本指南将介绍如何通过Ollama在GPU服务器安装DeepSeek-R1,并提供优化策略及Open WebUI网页界面配置方法。

409

12S BMS 核心设计:基于 STM32H743+BQ34Z100 的 SOC/SOH 实现与全链路技术解析(上)

本文详细介绍了基于STM32H743和BQ34Z100的12串锂电池管理系统(BMS)设计。该系统采用主控制器+专用电量监测计架构,可实现高精度SOC(±1%)和SOH(±2%)估算,支持36V-50.4V电压范围。硬件设计包括电压/电流采样、温度测量、保护电路等模块,软件实现基于HAL库开发,采用DMA方式提高I2C通信效率。系统通过TI专利的ImpedanceTrack™算法实现三维融合估算,并具备完善的保护功能。该设计适用于电动工具、轻型电动车等中功率设备,具有精度高、响应快。

bother3000的博客 1392

Windows本地AI开发环境搭建:WSL2+Ollama实战指南

在AI开发领域,本地开发环境的搭建是提升效率的关键环节。通过WSL2技术,开发者可以在Windows系统上获得接近原生Linux的性能体验,解决了跨平台开发的兼容性问题。结合Ollama的模型管理能力,能够高效部署和运行各类大语言模型。这种技术组合特别适合需要快速迭代的AI应用开发场景,如代码生成、文档处理等。实战中通过容器化部署Open WebUI,可以构建出响应迅速且隐私性强的本地AI开发平台,相比云服务方案更适用于对延迟敏感或需要离线开发的场景。

weixin_31715171的博客 74

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

上一篇: MySQL优化实战:当LEFT JOIN不按套路出牌时,如何强制指定驱动表?
下一篇: Vensim Model Reader隐藏功能挖掘:不花冤枉钱实现vdf文件解析的3种方法
python9snake
博客等级 码龄1天 0粉丝 1724原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值