【BUG记录】关于linux/pytorch等操作/BUG记录——持续更新

本文介绍了Linux系统下的常用操作技巧,包括文件拷贝、数据挂载、虚拟环境拷贝等,并提供了Conda环境下解决特定问题的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

LINUX/CONDA操作

1.不同服务器之间的文件拷贝

scp命令

https://www.linuxcool.com/scp
格式

scp -r [source file] [name]@[IP]:[target file]

例子
将本地的file1文件传输到主机:10.10.109.xxx小明账户的file2文件夹下。
-r表示递归复制

scp -r file1/ xiaoming@10.10.109.xxx:file2

2.linux数据挂载

mount命令

https://www.linuxcool.com/mount
格式

mount [设备] [挂载点]

例子
将设备/dev/cdrom挂载到本地/media/cdrom下进行访问
将远程主机10.10.100.xxx的数据挂载到本地进行访问

mount /dev/cdrom /media/cdrom
mount 10.10.100.xxx:data/ data/

3.利用CONDA对虚拟环境进行拷贝

conda pack命令

  • 克隆需要打包的环境并且激活
conda create -n [新环境的名称] --clone [老环境名称]
conda activate [新环境的名称]
  • 安装打包工具conda-forge和conda-pack
conda install -c conda-forge conda-pack
  • 打包虚拟环境
conda pack -n [新环境名称] -o [新环境名称].tar.gz

若出现BUG:CondaPackError: Cannot pack an environment with editable packages
修改命令如下:

conda pack -n [新环境名称] -o [新环境名称].tar.gz --ignore-editable-packages
  • 复制虚拟环境到相应主机的ananconda/envs
    可以使用scp命令
  • 解压虚拟环境
    在目标主机的ananconda/envs下,新建文件夹,文件夹名为环境名,再解压到该文件夹
mkdir ~/ananconda/envs/[虚拟环境名]
tar -xf [新环境名称].tar.gz -C ~/ananconda/envs/[虚拟环境名]
  • 激活环境
conda activate [虚拟环境名]

4.利用axel替代wget多线程加速文件下载

axel命令

https://www.linuxcool.com/axel
格式

axel -n [线程数] -o [文件存储位置] [下载连接]

例子
以5个链接数下载testfile.zip,并另存为/tmp/目录下的filetest.zip 文件。

axel -n 5 -o /tmp/filetest.zip  http://www.Linuxcool.com/testfile.zip

以20个线程循环下载xxx.txt文件中的连接到/temp文件夹下

DATA_DIR="/temp"
for line in $(cat xxx.txt)
do
  axel -n 20 -o ${DATA_DIR} $line 
done

5.挂载U盘到linux

  • 第一步:产看u盘名

fdisk命令

https://www.linuxcool.com/fdisk
格式

fdisk -l

例子
查看挂载U盘名

[root@localhost ~]# fdisk -l
Disk /dev/sda: 21.5GB, 21474836480 bytes
#系统硬盘
…省略部分输出…
Disk/dev/sdb: 8022 MB, 8022654976 bytes
#这就是识别的U盘,大小为8GB
94 heads, 14 sectors/track, 11906 cylinders
Units = cylinders of 1316 * 512 = 673792 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
Device Boot Start End Blocks Id System
/dev/sdb1 1 11907 7834608 b W95 FAT32
#系统给U盘分配的设备文件名
  1. 第二步:挂载U盘

mkdir命令

https://www.linuxcool.com/mkdir
格式

mkdir [文件夹名]

例子
创建挂载的空文件

mkdir /mnt/usb

挂载;mount命令见2

[root@localhost ~]# mount -t vfat /dev/sdb1 /mnt/usb/
挂载U盘。因为是Windows分区,所以是vfat文件系统格式
[root@localhost ~]# cd /mnt/usb/
#去挂载点访问U盘数据
[root@localhost usb]# ls
#输出为乱码
#之所以出现乱码,是因为编码格式不同

指定编码

[root@localhost ~]# mount -t vfat -o iocharset=utf8 /dev/sdb1 /mnt/usb/
#挂载U盘,指定中文编码格式为UTF-8
[root@localhost ~]# cd /mnt/usb/
[root@localhost usb]# ls
1111111年度总结及计划表.xls ZsyqlHL7osKSPBoGshZBr6.mp4 协议书
1221.doc 恭喜发财(定).mp4 新年VCR().mp4
#可以正确地查看中文了

pytorch

环境配置

1.No local packages or working download links found for certifi>=2017.4.17

具体情况说明:
在配置detectron2环境时,编译环节出现的问题。使用conda list查看虚拟环境,发现存在certifi包,切版本大于2017.4.17。
解决方案

pip install certifi==2017.4.17

2.Warning: grad and param do not obey the gradient layout contract. This is not an error, but may impair performance.

具体情况说明:
修改模型后出现该warning,往往是新增的模块的输入或者是使用了transpose或者permute或者切片操作出现tensor不连续的情况。
解决方案
在该操作后面加上.contiguous()

x = self.conv1(x.contiguous())

3.结束进程后GPU显存未释放问题

具体情况说明:
在重新运行程序时,出现RuntimeError: CUDA out of memory错误,使用nvidia-smi查看GPU使用情况,发现显存被假线程占用。
在这里插入图片描述
解决方案

  • 查看占用显卡的进程
fuser -v /dev/nvidia*

在这里插入图片描述

  • 杀死对应进程
kill -9 xxxx

4.RuntimeError: CUDA error: device-side assert triggered /opt/conda/conda-bld/pytorch_1607370193460/work/aten/src/ATen/native/cuda/Loss.cu:102: operator(): block: [0,0,0], thread: [0,0,0] Assertion input_val >= zero && input_val <= one failed.

具体情况说明:
在确认网络分类数量与标签范围都正确的情况下,出现上述错误,有可能是自己写的网络中存在未迭代或回归的参数造成的。
解决方案
仔细查看自己的forward()函数,特别是有循环的地方,看是否正确迭代。
错误例子

def forward(self, x):
	for i in range(self.num):
		out = self.c1(x)	#每次迭代均在使用初值x,导致out未进入迭代,出现参数与动态图不一致的情况。
		out = self.c2(out)
	return out

正确例子

def forward(self, x):
	out = x
	for i in range(self.num):
		out = self.c1(out)	
		out = self.c2(out)
	return out

5. RuntimeError: Expected to have finished reduction in the prior iteration before starting a new one. This error indicates that your module has parameters that were not used in producing loss. You can enable unused parameter detection by (1) passing the keyword argument find_unused_parameters=True to torch.nn.parallel.DistributedDataParallel; (2) making sure all forward function outputs participate in calculating loss. If you already have done the above two steps, then the distributed data parallel module wasn’t able to locate the output tensors in the return value of your module’s forward function. Please include the loss function and the structure of the return value of forward of your module when reporting this issue (e.g. list, dict, iterable)

具体情况说明:
单卡不报错,多卡报上述错误,主要有以下几种常见情况:

  • 定义了网络层却没在forward()中使用
  • forward()返回的参数未用于梯度计算
  • 使用了不进行梯度回归的参数进行优化

解决方案
首先确实是否是属于上述情况中的某种情况。
可以在定义优化器的代码前后后使用下面的代码进行验证。

for name,p in net.named_parameters():#net是你的网络 net = model()
	if p.requires_grad == False:
		print(name)
optimizer = ...#优化器定义
for p in optimizer.parameters():
	if p.requires_grad == False:
		print(p)

若属于,设置find_unused_parameters=True

net = DistributedDataParallel(net, device_ids=[local_rank], broadcast_buffers=False, find_unused_parameters=True)

若发现forward()返回值以及网络参数定义都没问题,请参照第4个BUG的解决方案排查代码。

6. TypeError: list indices must be integers or slices, not tuple

具体情况说明:
自己转换成所需格式后,观察源、目标文件格式一致。在代码计算时出现上述错误。原因是list与np.array索引规则不同,但是在打印输出或其他可视化方式下,无法看到具体的数组格式。
解决方案:
将所有list转换成np.array格式

new_tube = np.asarray(new_tube)
<think>好的,我现在需要帮助用户解决他们的问题:“gpus 0/0”。首先,用户提到的这个短语看起来像是与GPU相关的错误信息或状态提示。我需要确定用户的具体情况,以便提供准确的解决方案。 首先,“gpus 0/0”可能的含义是系统检测到0个可用的GPU中的0个在使用,或者是在某个框架(如TensorFlow或PyTorch)中显示没有可用的GPU。这可能意味着用户的代码试图访问GPU,但系统没有识别到可用的GPU设备。 接下来,我需要考虑用户可能遇到的不同情况。比如,用户是否确实有物理GPU?如果有,是否安装了正确的驱动程序?深度学习框架是否正确配置以识别GPU?或者是权限问题导致无法访问GPU? 然后,我应该分步骤思考可能的排查方法。首先,检查硬件是否存在,使用命令行工具如nvidia-smi来查看GPU状态。如果nvidia-smi没有输出,可能驱动未安装或GPU未被识别。如果驱动已安装,但框架无法检测到GPU,可能需要检查CUDA和cuDNN的安装情况,以及框架的版本是否兼容。 另外,用户可能在使用虚拟机或云服务,这时候需要确认是否分配了GPU资源。权限问题也可能导致无法访问GPU,比如用户没有加入正确的用户组,或者没有权限访问设备文件。 对于框架特定的问题,比如TensorFlow,用户可能需要验证tf.config.list_physical_devices('GPU')是否返回空列表,这时候需要检查CUDA环境变量是否正确设置,或者重新安装GPU版本的框架。 此外,用户可能遇到了软件冲突,比如多个CUDA版本共存导致的问题,或者环境变量设置不正确。这种情况下,需要指导用户检查环境变量,如PATH和LD_LIBRARY_PATH,确保指向正确的CUDA版本。 还有可能用户使用的代码中有设置仅使用CPU,比如在TensorFlow中使用tf.device('/cpu:0'),或者在PyTorch中将模型放在CPU上。这时候需要检查代码中是否有显式的设备指定。 最后,如果用户是在Docker容器中运行,可能需要确认容器是否正确配置了GPU支持,比如使用了--gpus参数,并且容器镜像内安装了必要的驱动和库。 总结来说,我需要提供一个系统性的排查步骤,从硬件检测到驱动安装,再到框架配置,逐步排除可能的问题,并给出相应的解决方案。同时,需要给出具体的命令和代码示例,帮助用户验证每个步骤,确保他们能够找到问题的根源并解决它。</think>以下是针对 **"gpus 0/0"** 问题的系统性排查指南,涵盖硬件检测、驱动配置和框架适配三个层级: --- ### **一、硬件检测:确认GPU物理存在** #### 1. 检查PCI设备列表 ```bash lspci | grep -i nvidia # Linux查看NVIDIA设备 # 正常情况应显示类似 "3D controller: NVIDIA Corporation GA102 [GeForce RTX 3090]" ``` - 若输出为空: - 物理卡未插紧(服务器需检查PCI-E槽位) - 电源供电不足(消费级显卡需外接供电线) #### 2. 服务器特殊场景 - **刀片服务器/虚拟机**: - 需在BIOS中启用SR-IOV虚拟化 - 云服务器需确认购买GPU实例规格(如AWS p3系列,阿里云GN6i) --- ### **二、驱动层:NVIDIA组件状态排查** #### 1. 验证驱动安装 ```bash nvidia-smi # 核心诊断命令 ``` - **正常输出示例**: ``` +-----------------------------------------------------------------------------+ | NVIDIA-SMI 525.85.12 Driver Version: 525.85.12 CUDA Version: 12.0 | |-------------------------------+----------------------+----------------------+ | 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 RTX 4090 Off | 00000000:17:00.0 Off | Off | | 30% 36C P8 15W / 450W | 0MiB / 24564MiB | 0% Default | | | | N/A | +-------------------------------+----------------------+----------------------+ ``` - **异常情况处理**: - 无输出:驱动未安装 → [安装官方驱动](https://www.nvidia.com/Download/index.aspx) - 报错`NVIDIA-SMI has failed...`: - 重启服务:`sudo systemctl restart nvidia-{persistenced,modeset}` - 内核签名冲突:禁用Secure Boot(UEFI设置) #### 2. CUDA工具链验证 ```bash nvcc --version # 查看CUDA编译器版本 cat /usr/local/cuda/version.txt # 查看CUDA运行时版本 ``` - **版本冲突表现**: - PyTorch要求CUDA版本与驱动兼容(例:Driver 525+支持CUDA 12.x) - 使用`conda list cudatoolkit`检查虚拟环境中的CUDA版本 --- ### **三、框架适配:深度学习库的GPU识别** #### 1. PyTorch检测逻辑 ```python import torch print(torch.cuda.is_available()) # 应输出True print(torch.cuda.device_count()) # 显示可用GPU数量 print(torch.cuda.get_device_name(0)) # 显示第1块GPU型号 ``` - **常见问题**: - 虚拟环境中PyTorch未安装GPU版本 → 重装:`pip install torch==2.0.0+cu117` - CUDA与PyTorch版本不匹配 → 查表:[PyTorch-CUDA兼容性](https://pytorch.org/get-started/previous-versions/) #### 2. TensorFlow检测逻辑 ```python import tensorflow as tf print(tf.config.list_physical_devices('GPU')) # 应显示GPU设备列表 ``` - **典型错误处理**: - 报错`Could not load dynamic library 'libcudart.so.11.0'` → 修复方法: ```bash # 添加CUDA库路径到环境变量 export LD_LIBRARY_PATH=/usr/local/cuda-11.8/lib64:$LD_LIBRARY_PATH ``` #### 3. Docker容器特殊配置 - 必须添加`--gpus all`参数: ```bash docker run --gpus all -it nvidia/cuda:11.8.0-base nvidia-smi ``` - 若仍不显示GPU: - 安装[NVIDIA Container Toolkit](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html) - 重启docker服务:`sudo systemctl restart docker` --- ### **四、权限问题排查(Linux专属)** #### 1. 用户组权限 ```bash groups | grep video # 检查用户是否在video组 sudo usermod -aG video $USER # 将当前用户加入video组 ``` #### 2. 设备文件权限 ```bash ls -l /dev/nvidia* # 检查设备文件权限 # 正常应为crw-rw-rw- sudo chmod a+rw /dev/nvidia* # 临时修改权限(重启失效) ``` --- ### **五、高级诊断工具** #### 1. 深度硬件检测 ```bash sudo nvidia-bug-report.sh # 生成详细日志(文件较大) ``` #### 2. PCI-E链路检测 ```bash sudo lspci -vvv -s 00:01.0 # 替换为实际GPU的Bus-ID # 关注LnkSta字段:Speed 8GT/s(PCIe 3.0), Width x16 ``` --- ### **故障排除流程图** ``` Start │ ▼ 能否执行nvidia-smi?—————否————→ 安装驱动/检查硬件 │是 ▼ CUDA版本与深度学习框架匹配? ————否 —→ 重装CUDA/框架 │是 ▼ 框架能否检测到GPU(torch.cuda.is_available())? │否 ▼ 检查Docker权限/用户组/video组 │ ▼ 检查环境变量(LD_LIBRARY_PATH) │ ▼ 联系厂商技术支持 ``` 通过以上步骤可覆盖95%的"gpus 0/0"问题根源。若仍无法解决,建议提供`nvidia-bug-report.log`给NVIDIA技术支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

K_K_Chen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值