28.12 磁盘扩容(raw) 28.13 磁盘扩容(qcow2) 28.14 调整cpu内存和网卡 28.15 迁移虚拟机...

本文详细介绍了KVM虚拟机的磁盘扩容、CPU内存调整、网卡增加及虚拟机迁移的方法。包括raw和qcow2磁盘的扩容步骤,动态调整CPU和内存的技巧,增加网卡以改变网络模式的过程,以及虚拟机迁移至远程机器的完整流程。
部署运行你感兴趣的模型镜像

28.12 磁盘扩容(raw)

28.13 磁盘扩容(qcow2)

28.14 调整cpu内存和网卡

28.15 迁移虚拟机

 

 

 

28.12 磁盘扩容(raw)

 

 

 

针对一块已经存在的盘进行增加容量

1.qemu-img resize /kvm_data/aminglinux02_3.raw +2G

2.qemu-img info /kvm_data/aminglinux02_3.raw

3.virsh destroy aminglinux02

4.virsh start aminglinux02

5.virsh console aminglinux02

6.fdisk -l 查看磁盘情况,并分新的分区

#如何利用上增加的2G空间,给他放到/dev/vda1里面去。可以重新分区,就是增加一个分区(原先的分区不要破坏,直接加上这2G空间)fisk /dev/sda然后按n,增加一个

7.除了对已有磁盘扩容外,还可以额外增加磁盘 #针对于标准分区的

qemu-img create -f raw /kvm_data/aminglinux02_2.raw 5G

virsh edit aminglinux02 //增加<disk>…</disk>,注意更改source、target、slot

virsh destroy aminglinux02

virsh start aminglinux02

 

 

 

实例:

[root@axinlinux-01 ~]# cd /kvm_data/

[root@axinlinux-01 kvm_data]# ls

aminglinux01_2.img  aminglinux01.img  aminglinux02_3.raw  aminglinux02.img  lost+found

[root@axinlinux-01 kvm_data]# qemu-img resize /kvm_data/aminglinux02_3.raw +2G #给这块磁盘加2G

Image resized.

[root@axinlinux-01 kvm_data]# qemu-img info /kvm_data/aminglinux02_3.raw #查看一下这块磁盘


[root@axinlinux-01 kvm_data]# qemu-img info /kvm_data/aminglinux02_3.raw
image: /kvm_data/aminglinux02_3.raw
file format: raw
virtual size: 12G (12884901888 bytes)
disk size: 2.6G

[root@axinlinux-01 kvm_data]# virsh start aminglinux02 #开启

域 aminglinux02 已开始

[root@axinlinux-01 kvm_data]# virsh console aminglinux02 #进入

[root@localhost ~]# fdisk -l #进入查看一下分区磁盘大小。因为阿鑫是重启后加的2G(虚拟机处于关机状态),所以这里直接显示了加2G空间之后的。正常加完空间,需要重启一下,先shutdown在start

磁盘 /dev/vda:12.9 GB, 12884901888 字节,25165824 个扇区 #此时变成了12G


Units = 扇区 of 1 * 512 = 512 bytes

扇区大小(逻辑/物理):512 字节 / 512 字节

I/O 大小(最小/最佳):512 字节 / 512 字节

磁盘标签类型:dos

磁盘标识符:0x000f3221




设备 Boot Start End Blocks Id System

/dev/vda1 * 2048 2099199 1048576 83 Linux

/dev/vda2 2099200 4196351 1048576 82 Linux swap / Solaris

/dev/vda3 4196352 20971519 8387584 83 Linux


 

 

 

[root@localhost ~]# fdisk /dev/vda #分区,将这2G的空间分区分进去

欢迎使用 fdisk (util-linux 2.23.2)。

 

更改将停留在内存中,直到您决定将更改写入磁盘。

使用写入命令前请三思。

 

 

命令(输入 m 获取帮助):n #按 n ,增加一个分区

Partition type:

p primary (3 primary, 0 extended, 1 free)

e extended

Select (default e): p #增加一个主分区

已选择分区 4

起始 扇区 (20971520-25165823,默认为 20971520): #默认就是从开头开始的

将使用默认值 20971520

Last 扇区, +扇区 or +size{K,M,G} (20971520-25165823,默认为 25165823): #在结尾结束的

将使用默认值 25165823

分区 4 已设置为 Linux 类型,大小设为 2 GiB #默认就分了这2G

 

命令(输入 m 获取帮助):p #最后再查看一些分区

 

磁盘 /dev/vda:12.9 GB, 12884901888 字节,25165824 个扇区


Units = 扇区 of 1 * 512 = 512 bytes

扇区大小(逻辑/物理):512 字节 / 512 字节

I/O 大小(最小/最佳):512 字节 / 512 字节

磁盘标签类型:dos

磁盘标识符:0x000f3221




设备 Boot Start End Blocks Id System

/dev/vda1 * 2048 2099199 1048576 83 Linux

/dev/vda2 2099200 4196351 1048576 82 Linux swap / Solaris

/dev/vda3 4196352 20971519 8387584 83 Linux

/dev/vda4 20971520 25165823 2097152 83 Linux #我们刚刚分进去的

最后可按 w ,保存

以上增加分区,如果是lvm格式的。我么是可以增加逻辑卷来实现扩容。那标准分区的话,没法扩容,只能重新分区

[root@axinlinux-01 kvm_data]# qemu-img create -f raw /kvm_data/aminglinux02_2.raw 5G #回到宿主机,增加一块新的磁盘

Formatting '/kvm_data/aminglinux02_2.raw', fmt=raw size=5368709120

[root@axinlinux-01 kvm_data]# qemu-img info aminglinux02_2.raw #查看

image: aminglinux02_2.raw


file format: raw

virtual size: 5.0G (5368709120 bytes)

disk size: 0

[root@axinlinux-01 kvm_data]# virsh edit aminglinux02 #编辑02的配置文件

<disk type='file' device='disk'>


<driver name='qemu' type='raw'/>


<source file='/kvm_data/aminglinux02_3.raw'/>


<target dev='vda' bus='virtio'/>

<address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>

</disk>


<disk type='file' device='disk'> #复制上面的内容,再重新修改一下


<driver name='qemu' type='raw'/>

<source file='/kvm_data/aminglinux02_2.raw'/> #这里改为上面新加磁盘的名字


<target dev='vdb' bus='virtio'/> #这里改为vdb

<address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/> #这里的数字要跟上面的数字区分开

</disk>

[root@axinlinux-01 kvm_data]# virsh destroy aminglinux02 #关闭02.也可以shutdown

域 aminglinux02 被删除

 

[root@axinlinux-01 kvm_data]# virsh start aminglinux02 #重新开启02

域 aminglinux02 已开始

 

[root@axinlinux-01 kvm_data]# virsh console aminglinux02 #进入02

连接到域 aminglinux02

换码符为 ^] #此处按空格

 

 

CentOS Linux 7 (Core)

Kernel 3.10.0-693.el7.x86_64 on an x86_64

localhost login: root

密码:

Last login: Tue Jan 8 23:44:40 on ttyS0

[root@localhost ~]# fdisk -l #查看分区

磁盘 /dev/vda:12.9 GB, 12884901888 字节,25165824 个扇区


Units = 扇区 of 1 * 512 = 512 bytes

扇区大小(逻辑/物理):512 字节 / 512 字节

I/O 大小(最小/最佳):512 字节 / 512 字节

磁盘标签类型:dos

磁盘标识符:0x000f3221




设备 Boot Start End Blocks Id System

/dev/vda1 * 2048 2099199 1048576 83 Linux

/dev/vda2 2099200 4196351 1048576 82 Linux swap / Solaris

/dev/vda3 4196352 20971519 8387584 83 Linux




磁盘 /dev/vdb:5368 MB, 5368709120 字节,10485760 个扇区 #看这是不是多了一块磁盘。可以针对这块磁盘分区、挂载

Units = 扇区 of 1 * 512 = 512 bytes

扇区大小(逻辑/物理):512 字节 / 512 字节

I/O 大小(最小/最佳):512 字节 / 512 字节

 

以上是,标准分区下,如果利用加进去的磁盘

但是在生产环境中,很多公司用的是云主机。当我们磁盘不够的时候,都是再买一块云盘。类似于你增加了一块盘,我们可以分区、挂载就可以了

 

 

 

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 

 

 

28.13 磁盘扩容(qcow2)

 

 

 

1.qemu-img resize /kvm_data/aminglinux01.img +2G

若提示qemu-img: Can't resize an image which has snapshots,需要删除快照

2.qemu-img info /kvm_data/aminglinux01.img

3.virsh destroy aminglinux01

4.virsh start aminglinux01

5.virsh console aminglinux01

6.fdisk -l 查看磁盘情况,并分新的分区

除了对已有磁盘扩容外(以上),还可以额外增加磁盘(以下)

1.qemu-img create -f qcow2 /kvm_data/aminglinux01_2.img 5G

2.virsh edit aminglinux01 //增加<disk>…</disk>,注意更改source、target、slot

3.virsh destroy aminglinux01

4.virsh start aminglinux01

 

 

 

实例:

[root@axinlinux-01 kvm_data]# qemu-img resize /kvm_data/aminglinux01.img +2G #会报错要删除快照

qemu-img: Can't resize an image which has snapshots


qemu-img: This image does not support resize

[root@axinlinux-01 kvm_data]# virsh snapshot-list aminglinux01 #查一下01的快照

名称               生成时间              状态
------------------------------------------------------------
 1561629728           2019-06-27 18:02:08 +0800 shutoff
 1561630057           2019-06-27 18:07:37 +0800 shutoff

[root@axinlinux-01 kvm_data]# virsh snapshot-delete aminglinux01  1561629728 #删除01的快照

已删除域快照 1561629728

[root@axinlinux-01 kvm_data]# virsh snapshot-delete aminglinux01  1561630057 #删除01的快照

已删除域快照 1561630057

[root@axinlinux-01 kvm_data]# qemu-img resize /kvm_data/aminglinux01.img +2G #给01扩容2G

Image resized.

接下来跟raw扩容分区一样了。

[root@axinlinux-01 kvm_data]# virsh start aminglinux01 #开启01

域 aminglinux01 已开始

 

[root@axinlinux-01 kvm_data]# virsh list

 Id    名称                         状态
----------------------------------------------------
 9     aminglinux02                   running
 10    aminglinux01                   running

 

[root@axinlinux-01 kvm_data]# virsh console aminglinux01 #进入01

[root@localhost ~]# fdisk -l #查看一下分区

Disk /dev/vda: 12.9 GB, 12884901888 bytes, 25165824 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x00073e2d

   Device Boot      Start         End      Blocks   Id  System
/dev/vda1   *        2048     2099199     1048576   83  Linux
/dev/vda2         2099200     4196351     1048576   82  Linux swap / Solaris
/dev/vda3         4196352    20971519     8387584   83  Linux

[root@localhost ~]# fdisk /dev/vda #开始分区

命令(输入 m 获取帮助):n #按 n 增加一个分区

Partition type:

p primary (3 primary, 0 extended, 1 free)

e extended

Select (default e): p #按 p 增加一个主分区

以上磁盘扩容方式完成

除了扩容,还可以直接增加一块新的磁盘,方式跟raw的一样

以后如果有这样的需求,建议字节增加一块新的磁盘的方式

 

 

 

 

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 

 

 

 

28.14 调整cpu内存和网卡

 

 

 

壹.修改配置文件的方式去调整内存和CPU:

1.virsh dominfo aminglinux01 //查看配置

2.virsh edit aminglinux01//更改如下部分内容

<memory unit='KiB'>1048576</memory>

<currentMemory unit='KiB'>524288</currentMemory>

<vcpu placement='static' current='1'>2</vcpu>

3.virsh shutdown aminglinux01

4.virsh start aminglinux01

#此时再去查看就是更改之后的配置了

贰.在线调整,不需要重启(动态的):

1.virsh setmem aminglinux01 800m//动态调整内存 #也可以减小内存

2.virsh dumpxml aminglinux01 > /etc/libvirt/qemu/aminglinux01.xml//需要把配置写入到配置文件里

3.virsh setvcpus aminglinux01 2 //动态调整cpu数量 #不可以减小CPU数量

叁.增加网卡:

1.virsh domiflist aminglinux01//查看网卡

3.virsh attach-interface aminglinux01 --type bridge --source virbr0//增加一块新的网卡,并设置为nat网络模式(virbr0类似vmware的vmnet8),这里如果写--source br0,则网络模式为桥接

4.virsh dumpxml aminglinux01 > /etc/libvirt/qemu/aminglinux01.xml//需要把配置写入到配置文件里

 

注意:以上动态的调整CPU、内存、网卡,都需要重定向到配置文件,不然不会生效。 所以,我们可以用第一种方式,直接去编辑配置文件

 

 

 

实例:

[root@axinlinux-01 kvm_data]# virsh dominfo aminglinux01 #如果想看详细的,可以看他的配置文件。如下条命令

Id: 1


名称: aminglinux01

UUID: 79005f12-8ccd-4fe4-bb64-b98b2be80cd2

OS 类型: hvm

状态: running

CPU: 1

CPU 时间: 38.4s

最大内存: 1048576 KiB

使用的内存: 524288 KiB

持久: 是

自动启动: 禁用

管理的保存: 否

安全性模式: none

安全性 DOI: 0

[root@axinlinux-01 kvm_data]# virsh edit aminglinux01 #在这也可以看他的详细的配置文件

<domain type='kvm'>

<name>aminglinux01</name>

<uuid>79005f12-8ccd-4fe4-bb64-b98b2be80cd2</uuid>

<memory unit='KiB'>1048576</memory>

<currentMemory unit='KiB'>624288</currentMemory> #比如我们把内存512m改成612m

<vcpu placement='static' current='2'>2</vcpu> #比如我们把cpu使用核数改成2核

<os>

 

 

<domain type='kvm'>
  <name>aminglinux01</name>
  <uuid>ea3fd5d6-52fd-4764-8a2e-ab8b8ba38399</uuid>
  <memory unit='KiB'>1048576</memory>
  <currentMemory unit='KiB'>624288</currentMemory>
  <vcpu placement='static'>2</vcpu>按照上面的改完,保存完会变回原来的文件。
 

[root@axinlinux-02 kvm_data]# virsh setmem aminglinux01 800m #动态的调整内存

 

[root@axinlinux-01 kvm_data]# virsh console aminglinux01 #进去01

连接到域 aminglinux01

换码符为 ^]

 

 

[root@localhost ~]# free -h #检查调整后的内存

total used free shared buff/cache available


Mem: 768M 85M 572M 6.5M 110M 543M

Swap: 1.0G 0B 1.0G

[root@axinlinux-02 kvm_data]# virsh setvcpus aminglinux01 1 #动态的减少CPU是不支持的

错误:不支持的配置:failed to find appropriate hotpluggable vcpus to reach the desired target vcpu count

 

[root@axinlinux-01 kvm_data]# virsh setvcpus aminglinux01 2 #动态的增加或等同于原先的数量是可以的

 

[root@axinlinux-01 kvm_data]# virsh setmem aminglinux01 500m #减少内存是可以的(减到500)

 

[root@axinlinux-01 kvm_data]# virsh dominfo aminglinux01 #查看一下

Id: 2


名称: aminglinux01

UUID: 79005f12-8ccd-4fe4-bb64-b98b2be80cd2

OS 类型: hvm

状态: running

CPU: 2

CPU 时间: 42.8s

最大内存: 1048576 KiB

使用的内存: 512000 KiB

持久: 是

自动启动: 禁用

管理的保存: 否

安全性模式: none

安全性 DOI: 0

生产环境中很少减少他的配置,大部分是增加配置

[root@axinlinux-01 kvm_data]# virsh dumpxml aminglinux02 > /etc/libvirt/qemu/aminglinux01.xml #此处需要注意的是,我们在动态的调整完配置以后,要重定向一下,就是保存到配置文件里。因为目前还是在内存里

[root@axinlinux-01 kvm_data]# vim /etc/libvirt/qemu/aminglinux01.xml #完成之后,我们在检查一下配置文件。此时配置文件是已经修改了。

[root@axinlinux-01 kvm_data]# virsh edit aminglinux01 #但是我们以这种方式查看配置文件,他还是之前的数据,并没有修改。因为他是在内存里调用的,所以是之前的数据。我们shuntdowm再start之后就会使调整总之后的了

[root@axinlinux-01 kvm_data]# virsh attach-interface aminglinux01 --type bridge --source virbr0 #增加一块网卡,source为桥接到那一块网卡上

[root@axinlinux-01 kvm_data]# virsh domiflist aminglinux01 #再来查看,就多了一块。桥接到了virbr0上去了
 

接口     类型     源        型号      MAC
-------------------------------------------------------
vnet1      bridge     br0        virtio      52:54:00:b1:0e:fb
vnet2      bridge     virbr0     rtl8139     52:54:00:dd:91:b8

[root@axinlinux-01 kvm_data]# virsh attach-interface aminglinux01 --type bridge --source br0 #也可以指定桥接到br0上

成功附加接口

 

[root@axinlinux-01 kvm_data]# virsh domiflist aminglinux01

 

接口 类型 源 型号 MAC

-------------------------------------------------------

vnet0 bridge br0 virtio 52:54:00:05:d6:07 #这两个br0相当于是vmware里面的桥接模式

vnet1 bridge virbr0 rtl8139 52:54:00:dd:d0:2b #这个virbr0相当于是vmware里面的NAT模式

vnet2 bridge br0 rtl8139 52:54:00:fe:07:85

[root@axinlinux-01 kvm_data]# virsh console aminglinux01 #我们进去查看一下网卡

连接到域 aminglinux01

换码符为 ^]

[root@localhost ~]# ifconfig #他已经动态的获取了IP。而且已经不是br什么什么了,而是ens什么什么

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 52:54:00:b1:0e:fb brd ff:ff:ff:ff:ff:ff
3: ens8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 52:54:00:dd:91:b8 brd ff:ff:ff:ff:ff:ff
    inet 192.168.122.166/24 brd 192.168.122.255 scope global noprefixroute dynamic ens8
       valid_lft 3443sec preferred_lft 3443sec
    inet6 fe80::1ce2:7a13:403:b333/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
4: ens9: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 52:54:00:7c:41:91 brd ff:ff:ff:ff:ff:ff
    inet 192.168.193.163/24 brd 192.168.193.255 scope global noprefixroute dynamic ens9
       valid_lft 1712sec preferred_lft 1712sec
    inet6 fe80::36fe:4ee2:3d5:2cc0/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

ens8: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500

inet 192.168.122.7 netmask 255.255.255.0 broadcast 192.168.122.255 #这个就是NAT

inet6 fe80::4b05:cf1c:da77:73c2 prefixlen 64 scopeid 0x20<link>

ether 52:54:00:dd:d0:2b txqueuelen 1000 (Ethernet)

RX packets 70 bytes 5813 (5.6 KiB)

RX errors 0 dropped 0 overruns 0 frame 0

TX packets 77 bytes 7000 (6.8 KiB)

TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

 

ens9: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500

inet 192.168.208.138 netmask 255.255.255.0 broadcast 192.168.208.255 #这个就是桥接

inet6 fe80::fea8:51ce:f27:cdd6 prefixlen 64 scopeid 0x20<link>

ether 52:54:00:fe:07:85 txqueuelen 1000 (Ethernet)

RX packets 377 bytes 18737 (18.2 KiB)

RX errors 0 dropped 0 overruns 0 frame 0

TX packets 13 bytes 1454 (1.4 KiB)

TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

 

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500

ether 52:54:00:05:d6:07 txqueuelen 1000 (Ethernet)

RX packets 7893 bytes 414062 (404.3 KiB)

RX errors 0 dropped 0 overruns 0 frame 0

TX packets 0 bytes 0 (0.0 B)

TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

 

lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536

inet 127.0.0.1 netmask 255.0.0.0

inet6 ::1 prefixlen 128 scopeid 0x10<host>

loop txqueuelen 1 (Local Loopback)

RX packets 452 bytes 39320 (38.3 KiB)

RX errors 0 dropped 0 overruns 0 frame 0

TX packets 452 bytes 39320 (38.3 KiB)

TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

 

[root@axinlinux-01 kvm_data]# virsh dumpxml aminglinux01 > /etc/libvirt/qemu/aminglinux01.xml #此时配置依然在内存里,想要生效,也是要重定向到配置文件里去

 

 

 

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 

 

 

28.15 迁移虚拟机

 

 

 

迁移就是从这一台到另一台,本机叫克隆

其实就是把.img文件或.raw拷贝到远程机器上去。还要把配置文件.xml文件拷贝到远程上去,然后再定义一下(define,就是能够virsh list出来)

该方式要确保虚拟机是关机状态

1.virsh shutdown aminglinux01

2.virsh dumpxml aminglinux01 > /etc/libvirt/qemu/aminglinux03.xml  // 如果是远程机器,需要把该配置文件拷贝到远程机器上

3.virsh domblklist aminglinux01  //查看虚拟机磁盘所在目录

4.rsync -av /kvm_data/aminglinux01.img /kvm_data/aminglinux03.img  //如果是迁移到远程,则需要把该磁盘文件拷贝到远程机器上

5.vi /etc/libvirt/qemu/aminglinux03.xml  //因为是迁移到本机,配置文件用的是aminglinux01子机的配置,不改会有冲突,所以需要修改该文件,如果是远程机器不用修改

修改domname:   <name>aminglinux03</name>

修改uuid(随便改一下数字,位数不要变)

修改磁盘路径

6.virsh define /etc/libvirt/qemu/aminglinux03.xml //定义新虚拟机

7.virsh list --all   //会发现新迁移的aminglinux03子机

转载于:https://my.oschina.net/u/3866192/blog/3067303

您可能感兴趣的与本文相关的镜像

Wan2.2-T2V-A5B

Wan2.2-T2V-A5B

文生视频
Wan2.2

Wan2.2是由通义万相开源高效文本到视频生成模型,是有​50亿参数的轻量级视频生成模型,专为快速内容创作优化。支持480P视频生成,具备优秀的时序连贯性和运动推理能力

<think>我们正在处理一个PyTorchCUDA内存不足的错误。用户提供的错误信息是:试图分配28.12GiB,而GPU总容量只有8.00GiB。显然,试图分配的内存远大于GPU的总容量,因此需要分析原因并给出解决方案。根据引用内容,我们可以总结一些常见原因解决方法:1.批量大小(batchsize)过大:减少批量大小是最直接的解决方法。2.模型或数据过大:检查模型结构输入数据大小,可能需要简化模型或减小输入尺寸。3.内存泄漏或缓存未释放:使用`del`释放不再需要的变量,并调用`torch.cuda.empty_cache()`。4.内存碎片:通过设置环境变量`PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True`来避免内存碎片(如引用[3]所述)。5.其他进程占用显存:确保没有其他程序占用显存,或者重启环境。针对用户的具体情况(试图分配28.12GiB,而GPU只有8GiB),我们可以从以下几个方面入手:步骤1:检查批量大小步骤2:检查模型数据步骤3:释放内存缓存步骤4:设置环境变量避免内存碎片步骤5:使用梯度累积(模拟更大的批量大小,但实际每次计算小批量)步骤6:使用混合精度训练(减少显存占用)步骤7:检查是否有不必要的变量保留下面我们将详细说明这些步骤。</think>### PyTorch CUDA内存不足错误解决方法 您遇到的`torch.OutOfMemoryError: CUDA out of memory. Tried to allocate 28.12 GiB. GPU 0 has a total capacity of 8.00 GiB`错误表明**程序试图分配的显存(28.12 GiB)远超GPU实际容量(8 GiB)**。以下是系统化的解决方案: #### 核心解决步骤 1. **减小批量大小** - 立即解决方案:将训练时的`batch_size`减半或更多 - 示例代码修改: ```python # 修改前 train_loader = DataLoader(dataset, batch_size=128) # 修改后 train_loader = DataLoader(dataset, batch_size=32) # 减少batch size ``` 2. **检查模型内存占用** - 在训练前添加诊断代码: ```python model = YourModel().to(device) print(f"模型参数占用显存: {torch.cuda.memory_allocated()/1024**3:.2f} GiB") ``` 3. **释放缓存与内存管理** - 在每个训练批次结束时添加: ```python for data, target in train_loader: # ...训练步骤... del data, target, output, loss # 显式删除中间变量 torch.cuda.empty_cache() # 清空缓存[^4] ``` #### 进阶优化方案 - **梯度累积技术**: 模拟大batch效果但显存不增加 ```python optimizer.zero_grad() for i, (data, target) in enumerate(train_loader): output = model(data) loss = loss_fn(output, target) / accumulation_steps loss.backward() # 累积梯度但不立即更新 if (i+1) % accumulation_steps == 0: optimizer.step() optimizer.zero_grad() ``` - **混合精度训练**: 减少显存占用30-50% ```python from torch.cuda import amp scaler = amp.GradScaler() with amp.autocast(): output = model(data) loss = loss_fn(output, target) scaler.scale(loss).backward() scaler.step(optimizer) scaler.update() ``` - **模型优化技术**: - 使用`model.to('cpu')`卸载未使用模块 - 启用检查点激活(Checkpointing): ```python from torch.utils.checkpoint import checkpoint # 在forward中替换 x = checkpoint(layer_module, x) ``` #### 环境级配置 1. **设置内存分配策略**(解决碎片问题): ```python import os os.environ['PYTORCH_CUDA_ALLOC_CONF'] = 'expandable_segments:True' ``` 2. **监控工具使用**: - 实时监控:`watch -n 1 nvidia-smi` - PyTorch内置分析: ```python print(torch.cuda.memory_summary()) ``` > **关键诊断**:当请求内存(28.12 GiB)远超物理显存(8 GiB)时,通常存在: > 1. 未正确释放的中间张量 > 2. 批量大小设置错误 > 3. 模型结构设计缺陷(如全连接层过大) 通过组合使用上述方法,可解决90%以上的CUDA OOM问题。对于8 GiB显存设备,建议单批次最大数据量不超过1.5 GiB[^1][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值