Linux命令+Pytorch框架學習ing
|
以前的框架學習,過于花里胡哨,本章開始,從實際應用出發!包含單機多卡使用 |
一. Linux命令
1. 復制文件/文件夾
cp 源文件地址 目標文件夾地址
cp -r 源文件夾地址 目標文件夾地址
2. 刪除文件/文件夾
rm -f 文件地址
rm -r 文件夾地址
3. 修改或移動 文件/文件夾名
# 修改
mv 文件名 新文件名
mv 文件夾名/ 新文件夾名/
# 移動
mv 文件名 目標地址/
mv 文件夾名 目標文件夾地址/ #(目標文件夾已存在)
4 查看磁盤內空間大小
du -h --max-depth=1
查看當前目錄及當前目錄下一級文件或文件夾各自使用的總空間大小,參考鏈接
二. Pytorch框架學習
1. Pytorch中clone(),detach()在反向傳播時的用法
? 參考博文:PyTorch中的clone(),detach()及相關擴展。
? 總結:如果 a=b.clone().操作 , 則反向傳播時梯度從a傳到b可以; 而detach()下a直接脫離原計算圖。
2. Pycharm字體放大
任務欄放大:參考博文
- File --> Settings --> Apperance .
代碼界面,鼠標滾動縮放:參考博文
- File —> setting —> Keymap —>在搜*尋框中輸入:increase —> Increase Font Size(雙擊) —> 在彈出的對話框中選擇Add Mouse Shortcut ;
- 同理,縮小則是搜索 decrease.
2. 輸出前K個最大值--torch.topk(input, k, dim=None, largest=True, sorted=True)
? 參考博文。
- dim:指定維度,否則是最后一個維度 例如 N1N2-->N1K
- largest:True,最大;False,最小
- sorted:返回的K值有序
? 輸出:value,index------index代表的value原本的序號
3. 查看實際運行時調用的cuda版本
import torch
print(torch.version.cuda)
4. 單機多卡 DDP
這里模型采用的torch1.10,故采用torchrun運行,參考博文。
- rank
- 多機多卡:代表某一臺機器
- 單機多卡:代表某一塊GPU
- world_size
- 多機多卡:代表有幾臺機器
- 單機多卡:代表有幾塊GPU
- local_rank
- 多機多卡:代表某一塊GPU的編號
- 單機多卡:代表某一塊GPU的編號
實操demo
? 終端運行
torchrun --nproc_per_node=2 ddp_demo.py --batchSize 64 --epochs 10
? 采用單機雙卡,注意這里,博文中所述--local_rank不是我們設定的,由代碼機器自動獲取,目前我print會出現兩次,應該有方法解決,等下次自己的模型需要再來補充。
點擊查看代碼
# ddp_demo.py
import torch
import torch.nn as nn
from torch.optim import SGD
from torch.autograd import Variable
from torch.utils.data import Dataset, DataLoader
from torch.utils.data.distributed import DistributedSampler
import os
import argparse
# 定義一個隨機數據集
class RandomDataset(Dataset):
def __init__(self, dataset_size, image_size=32):
images = torch.randn(dataset_size, 3, image_size, image_size)
labels = torch.zeros(dataset_size, dtype=int)
self.data = list(zip(images, labels))
def __getitem__(self, index):
return self.data[index]
def __len__(self):
return len(self.data)
# 定義模型
class Model(nn.Module):
def __init__(self, num_classes):
super(Model, self).__init__()
self.conv2d = nn.Conv2d(3, 16, 3)
self.fc = nn.Linear(30 * 30 * 16, num_classes)
self.softmax = nn.Softmax(dim=1)
def forward(self, x):
batch_size = x.shape[0]
x = self.conv2d(x)
x = x.reshape(batch_size, -1)
x = self.fc(x)
out = self.softmax(x)
return out
parser = argparse.ArgumentParser()
parser.add_argument('--gpu_id', type=str, default='0,1')
parser.add_argument('--batchSize', type=int, default=64)
parser.add_argument('--epochs', type=int, default=5)
parser.add_argument('--dataset-size', type=int, default=1024)
parser.add_argument('--num-classes', type=int, default=10)
# parser.add_argument('--local_rank', type=int, default=0)
config = parser.parse_args()
os.environ['CUDA_VISIBLE_DEVICES'] = config.gpu_id
torch.distributed.init_process_group(backend="nccl")
local_rank = torch.distributed.get_rank()
torch.cuda.set_device(local_rank)
device = torch.device("cuda", local_rank)
# 實例化模型、數據集和加載器loader
model = Model(config.num_classes)
dataset = RandomDataset(config.dataset_size)
sampler = DistributedSampler(dataset) # 這個sampler會自動分配數據到各個gpu上
loader = DataLoader(dataset, batch_size=config.batchSize, sampler=sampler)
# loader = DataLoader(dataset, batch_size=config.batchSize, shuffle=True)
loss_func = nn.CrossEntropyLoss()
if torch.cuda.is_available():
model.cuda()
model = torch.nn.parallel.DistributedDataParallel(model)
optimizer = SGD(model.parameters(), lr=0.1, momentum=0.9)
# 開始訓練
for epoch in range(config.epochs):
for step, (images, labels) in enumerate(loader):
if torch.cuda.is_available():
images = images.cuda()
labels = labels.cuda()
preds = model(images)
# print(f"data: {images.device}, model: {next(model.parameters()).device}")
loss = loss_func(preds, labels)
optimizer.zero_grad()
loss.backward()
optimizer.step()
print(f'Step: {step}, Loss: {loss.item()}')
print(f'Epoch {epoch} Finished !')
5. 程序死機--如何關閉
- 命令行 xkill --- 選擇窗口直接關閉
- ps -ef |grep python 然后kill -9 進程號
6.torch 復制維度
import torch
a = torch.rand(size=(2,3,2))
a = a.repeat(1,2,1) --> 得到(2,6,2)第二個維度會復制全部,這里是完全疊加的一個操作,即后三個是復制前三個數據
a = a.repeat_interleave(2, dim=1) --> 得到(2,6,2)這里的復制是間隔復制,假如初始是 1,2,3 ,復制后為 1,1,2,2,3,3
7.判斷nan值
import numpy as np
import torch
a = torch.rand(size=(2,3,2))
print(np.isnan(a.numpy()))
8.one-hot 與 單值標簽互轉
# one-hot -> 數值
>>> import torch
>>> onehot
array([[0., 1., 0., 0.],
[0., 0., 1., 0.],
[0., 0., 1., 0.],
[0., 0., 0., 1.]])
>>> np.argmax(onehot,1)
array([1, 2, 2, 3], dtype=int64)
>>> torch.topk(torch.tensor(onehot), 1)[1].squeeze(1)
tensor([1, 2, 2, 3])
# 數值-》one-hot
>>> import numpy as np
>>> label = [1,2,2,3]
>>> np.eye(4)[label]
array([[0., 1., 0., 0.],
[0., 0., 1., 0.],
[0., 0., 1., 0.],
[0., 0., 0., 1.]])
>>> import torch
>>> import torch.nn.functional as F
labels = torch.tensor([0,1,2])
num_classes = 3
one_hot_labels = F.one_hot(labels, num_classes)
吾志所向,一往無前;愈挫愈勇,再接再厲。

浙公網安備 33010602011771號