基于 Docker 的深度学习环境:Windows 篇

news2024/9/29 15:24:22

本篇文章,我们聊聊如何在 Windows 环境下使用 Docker 作为深度学习环境,以及快速运行 SDXL 1.0 正式版,可能是目前网上比较简单的 Docker、WSL2 配置教程啦。

写在前面

早些时候,写过一篇《基于 Docker 的深度学习环境:入门篇》,聊过了在 Linux 环境下,如何简单、正确的配置 GPU Docker 环境。

这几周总有不少好玩的开源模型和相关的应用组团出现,最近几篇文章发布后(尤其是 LLaMA2),总有 Windows 玩家因为环境原因提问。我觉得或许需要写一篇 Windows 下的 Docker 深度学习环境的配置教程,作为查缺补漏参考之用,应该能够减少不少因为环境所带来的问题。

我使用的操作系统版本为 Windows 11 家庭版,如果你使用的操作系统版本低于 Windows 11,可以考虑适当调整命令。

准备 Docker 虚拟化运行环境

想要完成 Docker 虚拟化环境的准备,一共分为三步:安装 Docker、配置 WSL2,开始玩。

安装 Docker 应用程序

我们可以从 Docker 官方网站,获取到 Docker 应用程序安装包的下载。

你看这个按钮,又大又方

下载完毕之后,“一路 Next” 完成安装后,点击安装程序的“重启按钮”等待程序安装完毕。

初步安装完毕,需要重启电脑

等待电脑重启完毕,我们启动 Docker ,可能会遇到报错提示,提醒我们需要 “WSL” 新版本。(如果已经是 WSL2 环境,则可以跳过下面的小节,如果不确定,可以跟着走一遍)

接下来,我们来准备 WSL2 的运行环境。

准备 WSL2 的运行环境

网上的安装教程绝大多数都是陈旧的资料,都比较繁琐,其实配置 WSL2 的环境非常简单。

右键任务栏上的“Windows”徽标,选择“终端管理员”,打开 Powershell 终端界面,执行下面的命令。

wsl --install

命令执行后,可能会得到执行命令超时的提醒。没有关系,再次执行命令即可,等到能够看到终端展示支持的 Linux 操作系统的列表,表示 WSL 初始化正常,网络访问正常:

# wsl --install

适用于 Linux 的 Windows 子系统已安装。

操作超时

如果遇到超时,没关系的,再试试就好:

# wsl --install

适用于 Linux 的 Windows 子系统已安装。

以下是可安装的有效分发的列表。
请使用“wsl --install -d <分发>”安装。

NAME                                   FRIENDLY NAME
Ubuntu                                 Ubuntu
Debian                                 Debian GNU/Linux
kali-linux                             Kali Linux Rolling
Ubuntu-18.04                           Ubuntu 18.04 LTS
Ubuntu-20.04                           Ubuntu 20.04 LTS
Ubuntu-22.04                           Ubuntu 22.04 LTS
OracleLinux_7_9                        Oracle Linux 7.9
OracleLinux_8_7                        Oracle Linux 8.7
OracleLinux_9_1                        Oracle Linux 9.1
openSUSE-Leap-15.5                     openSUSE Leap 15.5
SUSE-Linux-Enterprise-Server-15-SP4    SUSE Linux Enterprise Server 15 SP4
SUSE-Linux-Enterprise-15-SP5           SUSE Linux Enterprise 15 SP5
openSUSE-Tumbleweed                    openSUSE Tumbleweed

当你看到上面的命令后,我们就可以执行第二条命令 wsl --update 来完成 wsl 主体程序的更新啦:

# wsl --update

正在安装: 适用于 Linux 的 Windows 子系统
已安装 适用于 Linux 的 Windows 子系统。

命令执行完毕后,我们能够看到类似上面的提醒。查看程序版本和内核,能够看到类似下面的信息:

# wsl --version

WSL 版本: 1.2.5.0
内核版本: 5.15.90.1
WSLg 版本: 1.0.51
MSRDC 版本: 1.2.3770
Direct3D 版本: 1.608.2-61064218
DXCore 版本: 10.0.25131.1002-220531-1700.rs-onecore-base2-hyp
Windows 版本: 10.0.22621.1778

接着,为了让 Docker 跑的更欢脱,以及能够正常调用 GPU,我们需要切换 WSL 默认版本为 WSL2

# wsl --set-default-version 2

有关与 WSL 2 关键区别的信息,请访问 https://aka.ms/wsl2

操作成功完成。

上面的操作都完成后,我们再次打开 Docker,就能够看到正常运行的界面啦。

Docker 正常运行

在使用 Docker 调用容器镜像前,我们还需要验证下 Docker 是否能够和 GPU 正常通信。

验证 Docker 中 GPU 是否能够被正常调用

和上篇文章一样,可以先下载一个 Nvidia 官方的 PyTorch 镜像:

docker pull nvcr.io/nvidia/pytorch:23.07-py3

镜像比较大,需要耐心等待几分钟:

# docker pull nvcr.io/nvidia/pytorch:23.07-py3

23.07-py3: Pulling from nvidia/pytorch
...
...
Digest: sha256:c53e8702a4ccb3f55235226dab29ef5d931a2a6d4d003ab47ca2e7e670f7922b
Status: Downloaded newer image for nvcr.io/nvidia/pytorch:23.07-py3

当镜像下载完毕后,我们可以使用命令 docker run -it --gpus=all --rm nvcr.io/nvidia/pytorch:23.07-py3 nvidia-smi 来使用 Docker 启动一个容器,并在容器中调用 nvidia-smi 显卡管理程序,来查看显卡的状况:

# docker run -it --gpus=all --rm nvcr.io/nvidia/pytorch:23.07-py3 nvidia-smi

=============
== PyTorch ==
=============

NVIDIA Release 23.07 (build 63867923)
PyTorch Version 2.1.0a0+b5021ba

Container image Copyright (c) 2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved.

Copyright (c) 2014-2023 Facebook Inc.
Copyright (c) 2011-2014 Idiap Research Institute (Ronan Collobert)
Copyright (c) 2012-2014 Deepmind Technologies    (Koray Kavukcuoglu)
Copyright (c) 2011-2012 NEC Laboratories America (Koray Kavukcuoglu)
Copyright (c) 2011-2013 NYU                      (Clement Farabet)
Copyright (c) 2006-2010 NEC Laboratories America (Ronan Collobert, Leon Bottou, Iain Melvin, Jason Weston)
Copyright (c) 2006      Idiap Research Institute (Samy Bengio)
Copyright (c) 2001-2004 Idiap Research Institute (Ronan Collobert, Samy Bengio, Johnny Mariethoz)
Copyright (c) 2015      Google Inc.
Copyright (c) 2015      Yangqing Jia
Copyright (c) 2013-2016 The Caffe contributors
All rights reserved.

Various files include modifications (c) NVIDIA CORPORATION & AFFILIATES.  All rights reserved.

This container image and its contents are governed by the NVIDIA Deep Learning Container License.
By pulling and using the container, you accept the terms and conditions of this license:
https://developer.nvidia.com/ngc/nvidia-deep-learning-container-license


NOTE: The SHMEM allocation limit is set to the default of 64MB.  This may be
   insufficient for PyTorch.  NVIDIA recommends the use of the following flags:
   docker run --gpus all --ipc=host --ulimit memlock=-1 --ulimit stack=67108864 ...

Sat Jul 29 01:44:04 2023
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 530.37                 Driver Version: 531.30       CUDA Version: 12.1     |
|-----------------------------------------+----------------------+----------------------+
| 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         On | 00000000:01:00.0  On |                  Off |
| 32%   38C    P8               23W / 450W|    571MiB / 24564MiB |      4%      Default |
|                                         |                      |                  N/A |
+-----------------------------------------+----------------------+----------------------+

+---------------------------------------------------------------------------------------+
| Processes:                                                                            |
|  GPU   GI   CI        PID   Type   Process name                            GPU Memory |
|        ID   ID                                                             Usage      |
|=======================================================================================|
|  No running processes found                                                           |
+---------------------------------------------------------------------------------------+

通过上面的日志,可以看到显卡状态正常,同时能够读取到所有我们需要的信息。

写到这里,Windows 环境下的 Docker 深度学习环境就聊完了,如果你想了解更多,可以翻阅《基于 Docker 的深度学习环境:入门篇》文章中的“AI 相关的 Docker 镜像,及实际使用”和“其他”小节,来进行查缺补漏。

使用 Docker 在容器中调用 GPU

当然,不实实在在来一场实践,不是我的写作风格。

所以,在环境就绪之后,我们来使用 Docker 来尝试运行上一篇文章《使用 Docker 快速上手 Stability AI 的 SDXL 1.0 正式版》中提到的 Stable Diffusion XL 1.0 的镜像,让它能够在 Windows 环境下正常使用。

这里,我们跳过上一篇的准备工作和镜像构建,直接使用现成的运行环境来折腾 SDXL 1.0。当然,如果你感兴趣,可以翻阅上篇文章全文,来了解背后的技术细节,这里就不展开啦。

下载模型文件和容器环境

我们可以从网盘地址1和网盘地址2,分别下载官方的模型文件和整理好的 Docker 容器环境(环境只下载 sdxl-runtime.tar 即可)。

如果下载出现问题,可以前往 soulteary/docker-sdxl 项目 issue 留言反馈或参考上一篇文章,从 HuggingFace 下载模型,和进行容器镜像的手动构建。

加载模型并准备工作目录

以 C 盘为例,我们在盘根创建一个名为 docker-sdxl 的目录,然后将 sdxl-runtime.tar 和下载模型目录中的 stabilityai 放到这个目录中。

然后,切换工作目录到 C:/docker-sdxl

cd C:/docker-sdxl/

接着,执行命令,载入容器镜像文件 docker load -i .\docker-sdxl\sdxl-runtime.tar

docker load -i .\docker-sdxl\sdxl-runtime.tar
68ad565f4346: Loading layer [==================================================>]   2.56kB/2.56kB
b279d196469f: Loading layer [==================================================>]  384.6MB/384.6MB
08135af11e7a: Loading layer [==================================================>]  1.536kB/1.536kB
6b36eae25335: Loading layer [==================================================>]  6.144kB/6.144kB
72a8d0a30e5a: Loading layer [==================================================>]  18.94kB/18.94kB
Loaded image: soulteary/sdxl:runtime

镜像加载完毕之后,我们就可以运行 Docker 容器,来玩 SDXL 啦:

 docker run --gpus all --ipc=host --ulimit memlock=-1 --ulimit stack=67108864 --rm -it -v C:/docker-sdxl/stabilityai/:/app/stabilityai -p 7860:7860 soulteary/sdxl:runtime

可以看到,命令和前一篇适用于 Linux 环境的文章几乎一致,除了在 Linux 环境下,我们可以通过 pwd 来表示当前目录,而 Windows 环境中,最佳实践是通过完整目录(C:/docker-sdxl/stabilityai/)来表示。

在命令执行完毕后,我们就进入了交互式的终端,接下来我们可以执行和上一篇文章一样的三个程序:basic.pyrefiner.pyrefiner-low-vram.py

# 执行基础模型程序
python basic.py
# 执行全家桶模型程序
python refiner.py
# 执行使用显存稍低的程序
python refiner-low-vram.py

资源要求和消耗和上一篇并没有什么不同,唯一的差别可能是 WSL2 的数据传输性能相比 Linux 环境要低不少,模型加载的时间会长很多,需要耐心等待。

当模型完全加载完毕,我们能够看到下面的日志:

python basic.py
Loading pipeline components...: 100%|███████████████████████████████████████████████████████████████████████████| 7/7 [00:03<00:00,  1.95it/s]
Running on local URL:  http://0.0.0.0:7860/


To create a public link, set `share=True` in `launch()`.

接下来,访问 http://localhost:7860 或者 http://你的IP:7860 来访问 SDXL 1.0 的 Web 界面啦。

在 Windows 下的 Docker 中运行 SDXL 1.0

虽然上面日志中加载模型的性能比较差,但实际推理的性能非常好,能够达到 11~13it/s,和 Linux 没有什么差异。(都在显存里了,没有数据交换)

因为 Windows 默认会打开防火墙,限制程序对外暴露端口,避免一些安全问题。在使用的时候,如果你的 Windows 主机和你要访问这个服务的设备是两台设备,你需要关闭或者在防火墙内放行这个应用,有类似情况的小伙伴可以注意下,调整下系统防火墙配置。

其他

我之前已经写过不少 AI 相关的内容,尤其是偏实践类的文章,你可以访问下面几个链接来获取能够快速上手的教程。比如,“Python” 主题的内容、“Llama ” 主题相关的内容、“Stable Diffusion ” 主题相关的内容。

或者,也可以访问我在 GitHub 上公开的项目,获取相关的代码或者 Docker 镜像,自己亲手试验下 “人工智能” 的 iPhone Moment 时代的各种模型。

最后

好了,这篇文章就先写到这里啦,😄

– EOF


我们有一个小小的折腾群,里面聚集了一些喜欢折腾、彼此坦诚相待的小伙伴。

我们在里面会一起聊聊软硬件、HomeLab、编程上的一些问题,也会在群里不定期的分享一些技术资料。

喜欢折腾的小伙伴,欢迎阅读下面的内容,扫码添加好友。

关于“交友”的一些建议和看法

添加好友时,请备注实名和公司或学校、注明来源和目的,珍惜彼此的时间 😄

苏洋:关于折腾群入群的那些事


本文使用「署名 4.0 国际 (CC BY 4.0)」许可协议,欢迎转载、或重新修改使用,但需要注明来源。 署名 4.0 国际 (CC BY 4.0)

本文作者: 苏洋

创建时间: 2023年07月29日
统计字数: 8488字
阅读时间: 17分钟阅读
本文链接: https://soulteary.com/2023/07/29/docker-based-deep-learning-environment-under-windows.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/808206.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++设计模式::享元模式(combination)-可运行

实现: 1) cShape:抽象接口; cShape*:具体实现的接口; 2) cFactory:按照传入参数color来区别对象, 如果已经创建过, 那就返回已有的, 否则创建新的. 使用: 传入参数, 获取被创建的对象(创建尽可能少的对象) 1) 设计框架 /*shape.hpp*/ #pragma once #if…

CSS伪元素详解以及伪元素与伪类的区别

伪元素常常被误解为伪类&#xff0c;主要在于他们的语法相似&#xff0c;都是对于选择器功能的扩展&#xff0c;相似程度很高导致被混淆。 本文通过详细介绍伪元素和常见的使用方法&#xff0c;最后也会分析下伪元素与伪类的基本区别。 基本描述 CSS伪元素也是应用于选择器的…

渗透测试:Linux提权精讲(一)之sudo方法第一期

目录 写在开头 CVE-2019-14287 sudo apt和sudo apt-get sudo apache2 sudo ash sudo awk sudo base32/58/64/nc/z sudo cp sudo cpulimit sudo curl sudo date sudo dd sudo dstat sudo ed sudo env sudo exiftools 总结与思考 写在开头 在进行渗透测试获取…

sql server表值函数

一、创建测试表 Employees 二、创建表值函数 -- DROP FUNCTION TableIntSplit;CREATE FUNCTION TableIntSplit(Text NVARCHAR(4000),Sign NVARCHAR(4000)) RETURNS tempTable TABLE(Id INT ) AS BEGIN DECLARE StartIndex INT DECLARE FindIndex INT DECLARE Content VARCHAR(…

浅谈 Spring AOP 思想

Spring AOP AOP 切面编程普通代理类JDK动态代理Cglib动态代理AOPAOP术语AOP切面编程的优势Advice通知类型&#xff08;5种&#xff09;通知的执行顺序 Order切入点表达式表达式execution注解annotation Spring事务管理Transactional 及 Transactional 的两个属性Transactional …

AR开发平台 | 探索AR技术在建筑设计中的创新应用与挑战

随着AR技术的不断发展和普及&#xff0c;越来越多的建筑师开始探索AR技术在建筑设计中的应用。AR(增强现实)技术可以通过将虚拟信息叠加到现实场景中&#xff0c;为设计师提供更加直观、真实的建筑可视化效果&#xff0c;同时也可以为用户带来更加沉浸式的体验。 AR开发平台广…

SpringBoot项目连接数据库

1、找到applications.yml&#xff0c;如下图 2、写入代码 server:port: 9494spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/自己的数据库表名?serverTimezoneGMT%2b8username: rootpassword: root

短视频矩阵源码开发搭建分享--多账号授权管理

目录 文章目录 前言 一、矩阵号系统是什么&#xff1f; 二、使用步骤 1.创建推广项目 2.多账号授权 3.企业号智能客服系统 总结 前言 短视频多账号矩阵系统&#xff0c;通过多账号一键授权管理的方式&#xff0c;为运营人员打造功能强大及全面的“矩阵式“管理平台。…

修改整数(有点坑,所以发出来了)

问题描述 小贝给了小聪一个正整数 x&#xff0c;但是小聪决定把这个数改掉。她可以把整数 x 每个位置上的数 t 改成 9-t。 请你帮助小聪来计算一下&#xff0c;如何把 x 改成一个最小的正整数&#xff0c;注意&#xff0c;不能出现首位为 0 的情况。 输入格式 输入一个正整数…

Vue通过指令 命令将打包好的dist静态文件上传到腾讯云存储桶 (保存原有存储目录结构)

1、在项目根目录创建uploadToCOS.js文件 (建议起简单的名字 方便以后上传输入命令方便) 2、uploadToCOS.js文件代码编写 const path = require(path); const fs = require(fs); const COS = require(cos-nodejs-sdk-v5);// 配置腾讯云COS参数 const cos = new COS({SecretI…

NoSQL-Redis集群

NoSQL-Redis集群 一、集群&#xff1a;1.单点Redis带来的问题&#xff1a;2.解决&#xff1a;3.集群的介绍&#xff1a;4.集群的优势&#xff1a;5.集群的实现方式&#xff1a; 二、集群的模式&#xff1a;1.类型&#xff1a;2.主从复制&#xff1a; 三、搭建主从复制&#xff…

vscode 打开文件时如何在资源管理器中展开文件所在的整个目录树(包含node_modules)

如题。去 首选项 --> 设置 中 搜索 “Auto Reveal”&#xff0c;然后选true&#xff0c;注意把下面的Auto Reveal Exclude排除项中的node_modules去掉&#xff0c;这样才能定位到node_modules中的文件。 **/node_modules

【FPGA IP系列】FIFO的通俗理解

FPGA厂商提供了丰富的IP核&#xff0c;基础性IP核都是可以直接免费调用的&#xff0c;比如FIFO、RAM等等。 本文主要介绍FIFO的一些基础知识&#xff0c;帮助大家能够理解FIFO的基础概念。 一、FIFO介绍 FIFO全称是First In First Out&#xff0c;即先进先出。 FIFO是一个数…

函数重载与引用

文章目录 一、函数重载1. 重载规则2.重载列子3.函数名修饰规则 二、引用1.本质2.特性1. 引用必须在定义时初始化2 . 一个变量可以有多个引用3 . 引用一旦引用一个实体&#xff0c;就不能引用其他实体 3.引用例子4.引用的权限5.效率比较6.指针跟引用的区别 一、函数重载 函数重…

我的创作纪念日 --- 鲁迅文学无聊版

机缘 ------从第一次使用CSDN这个网站到现在已经快四年了&#xff0c;我大抵是病了&#xff0c;2021年7月29日才心血来潮写下来了第一篇自己的博客&#xff0c;回顾起来&#xff0c;已经过去了2年。如此这般&#xff0c;断断续续的写过一些博客&#xff0c;但终归是心血来潮罢了…

【Docker】Docker的优势、与虚拟机技术的区别、三个重要概念和架构及工作原理详细讲解

前言 Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。 作者简介&#xff1a; 辭七七&#xf…

PS - Photoshop 实现涂抹功能 (橡皮擦、图章、吸管、画笔)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/131997323 在 Photoshop 中&#xff0c;橡皮擦工具&#xff0c;以及吸管工具和画笔工具可以配合使用&#xff0c;实现涂抹功能&#xff0c;再通过…

第四届世界蜂疗大会在中国·重庆武隆盛大开幕

【39蜂疗网】记者 讯 7月25日至27日&#xff0c;“世界中联蜂疗专业委员会第五届学术年会暨第四届世界蜂疗大会、中国民族医药学会蜂疗分会2023年学术年会”在重庆武隆正式启幕。开幕式上&#xff0c;重庆市政府副市长但彦铮宣布开幕&#xff1b;人民英雄、中国工程院院士张伯礼…

QPainter绘制雷达界面

文章目录 功能实现定义的结构体定义的函数效果图gitee源码链接 功能实现 相较于上一版&#xff0c;这一版添加的功能有&#xff1a; 1、自适应窗口 2、扫描方式&#xff08;圆周扫描、扇形扫描&#xff08;指定起始角度和结束角度&#xff09;&#xff09; 3、扫描方向&#x…

WITH AS 的 sql语法是啥意思

WITH t1 AS ( select * from my_table_1 where age >30 ), t2 AS ( select * from my_table_2 where sex M ) select * from t1 inner join t2 on t1.id t2.t_id;WITH AS 的 sql语法是啥意思&#xff1f; WITH和AS是SQL语句中的关键字&#xff0c;用于创建临时命名的查询…