
使用這些基本 REST API 最佳實踐構建出色的 API
如果要兼顧生活及開發,就筆記本上面看看視頻、寫寫博客、跑跑代碼(像我平時就是Ctrl+C ,再跑跑代碼的),Windows就夠了,操作簡單而且上面的各種依賴包也很齊全。(下文主要以Windows系統為例展開介紹,其他系統也是大同小異,有不清楚地方可以找相應教程)。
如果既想要Linux做開發、Windows兼顧生活,可以借助安裝雙系統或者虛擬機,那么有幾種選擇:
3.1 安裝雙系統
硬件資源夠的話,安裝雙個系統是比較直接的,能夠比較純粹地使用Windows或者Linux,但是切換比較麻煩,需要開關機來回切換。
3.2 虛擬機
通過在虛擬機(如vmware)上面再安裝另一個操作系統,這樣打開虛擬機就可以很方便使用另一個系統了,但是缺點是虛擬機的硬件資源消耗也很高,而且有性能問題及各種bug。按我之前的嘗試,這里更推薦Linux作為主系統+虛擬機的Windows,能更好發揮出Linux開發的效能。
3.3 WSL
適用于 Linux 的 Windows 子系統 (WSL)是微軟官方發布的應用,通俗來說它也就是Windows上面啟用的Linux子系統。WSL安裝非常簡單,運行WSL的開銷比運行一個虛擬機低很多,在WSL上面還可以配置cuda調用其GPU資源(但貌似配置復雜),用于日常學習是完全夠用了。缺點是不如原Linux來得純粹,用于高強度開發的話,性能會弱些,還容易卡各種bug。
WSL安裝簡單,在windows功能上打勾啟用wsl功能后,
WIN+R運行cmd,一句命令行wsl –install就可以安裝好ubuntu系統了,安裝好后 WSL就可以使用Linux系統了(命令行cli版),
兩個系統之間數據可以自由訪問,如訪問D盤數據只要 cd /mnt/d,雙系統使用上是非常方便的。
可以參考WSL官方文檔:https://learn.microsoft.com/zh-cn/windows/wsl/install
搞定操作系統(比如Windows),接下來配置個Python環境。實現Python環境配置及依賴包管理最方便的就是安裝個 Anaconda,官網下載https://www.anaconda.com/download,
如果網速慢,也可以到清華鏡像上面快速下載一個https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/
安裝也很簡單,一路確認就安裝好了。這里可以勾選Add path 就可以配置好環境變量,也可以再勾選Anaconda作為默認Python版本,后面比較省心。
通過點擊Jupyter Notebook就可以進入Python開發環境了,
如果平時以小項目、數據分析、調調模型為主,Jupyter Notebook作為開發工具是夠的。如果平時任務以大型項目居多,還可以再安裝個IDE編輯器如VScode、Pycharm。
這里有兩種方案,如果只有CPU資源用于開發,直接選擇【1 CPU環境配置】就可以很快開始深度學習建模。
如有GPU資源,可以選擇【2 GPU環境配置】開始繁瑣的安裝配置及建模。
安裝相關的python依賴包,主要的如數據處理庫Pandas、機器學習庫Scikit-learn、深度學習庫Tensorflow、Pytorch等等。簡單安裝幾個必要的包,后面運行項目代碼,發現缺什么包再補什么。
可以點擊prompt打開命令行安裝,
Python安裝依賴也很簡單,比如pip install tensorflow 就可以安裝好Tensorflow神經網絡庫。
安裝好相關的依賴包后,基本上就可以開始在CPU運算環境的深度學習、機器學習的代碼開發了。
在大數據量、大模型煉丹的場景下,深度學習會耗費大量的算力及時間,這時可以用GPU來加速神經網絡模型訓練(嘮叨一句,購置gpu首選大顯存的!)。
如果硬件配置有nvdia的GPU的話(使用 AMD 的 GPU 也可行但很麻煩,相關信息可參閱:https://rocmdocs.amd.com/en/latest/),接下來就可以開始GPU開發環境cuda的配置,這個流程稍微繁瑣容易出錯,請耐心配置。
通過桌面鼠標右鍵進入nvdia的控制面板,看到顯卡類型,可以看到我的游戲本有配了個獨立顯卡950M(算力僅僅為5,雖然這是GPU中的渣渣..但也比純cpu香啊!),
依據顯卡算力我們可以知道對應支持的cuda版本號范圍,像算力為5對應的cuda版本號就可以選擇cuda-10.1
(好像也可以在nvdia控制面板的系統信息看到相關cuda的版本號)
相應的,我們到官網下載相應版本的cuda,https://developer.nvidia.com/cuda-toolkit-archive
然后,運行cuda安裝包,我直接精簡安裝,一路確認就安裝好了。
win+R 輸入cmd,進入命令行界面:
輸入以下指令:nvcc -V 能夠正常顯示版本號,cuda就安裝好了
# $ nvcc -V
# nvcc: NVIDIA (R) Cuda compiler driver
# Copyright (c) 2005-2019 NVIDIA Corporation
# Built on Fri_Feb__8_19:08:26_Pacific_Standard_Time_2019
# Cuda compilation tools, release 10.1, V10.1.105
cuda安裝完了還需要下載個cudnn(即 CUDA Deep Neural Network 軟件庫),這是一個 GPU 加速的深度神經網絡基元庫。不同版本的cuda 對應著不同的cudnn版本(我這邊cuda10.1對應cudnn7.5的),詳情可以從英偉達官網找到具體信息https://developer.nvidia.com/rdp/cudnn-archive ,下載cudnn還需要去英偉達官網注冊。
cudnn解壓以后將各個子文件夾
拷貝到cuda安裝目錄下,到此,cuda整個環境就配置好了。
最后,安裝Python相關的(支持GPU)的深度學習庫,本文建模用的是pytorch(tensorflow、keras等其他庫也是可以的)
可以到官網下載相應的pytorch版本,https://pytorch.org/get-started/locally/
官網會很友好地給出相應的所選的cuda版本對應的安裝命令,
比如我這邊cuda10.1對應的命令如下,在anaconda命令行輸入就可以安裝相關依賴包。
conda install pytorch==1.7.1 torchvision==0.8.2 torchaudio==0.7.2 cudatoolkit=10.1 -c pytorch
安裝以后,可以檢查GPU的可用性 ,通過調用torch.cuda.is_available()。如果結果為 True,則表明系統已正確安裝Nvidia驅動。進入jupyter notebook運行:import torch torch.cuda.is_available()
本節的示例是調用GPU或CPU版的pytorch搭建深度學習圖像分類模型(CNN),并對比下性能差異。
%%time
import torch,torchvision
import torch.nn as nn
import torchvision.transforms as transforms
## 項目源碼可以到https://github.com/aialgorithm/Blog
## 算法進階公眾號閱讀原文也可跳轉到源碼
#定義CNN神經網絡模型
class CNNCifar(nn.Module):
def __init__(self):
super(CNNCifar,self).__init__()
self.feature = nn.Sequential(
nn.Conv2d(3,64,3,padding=2), nn.BatchNorm2d(64), nn.ReLU(), nn.MaxPool2d(2,2),
nn.Conv2d(64,128,3,padding=2), nn.BatchNorm2d(128), nn.ReLU(), nn.MaxPool2d(2,2),
nn.Conv2d(128,256,3,padding=1),nn.BatchNorm2d(256), nn.ReLU(), nn.MaxPool2d(2,2),
nn.Conv2d(256,512,3,padding=1),nn.BatchNorm2d(512), nn.ReLU(), nn.MaxPool2d(2,2)
)
self.classifier=nn.Sequential(
nn.Flatten(),
nn.Linear(2048, 4096),nn.ReLU(),nn.Dropout(0.5),
nn.Linear(4096,4096), nn.ReLU(),nn.Dropout(0.5),
nn.Linear(4096,100)
)
def forward(self, x):
x = self.feature(x)
output = self.classifier(x)
return output
net = CNNCifar()
print(net)
#加載數據集
apply_transform = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010)),
])
train_dataset = torchvision.datasets.CIFAR10(root='../data/cifar100', train=True, download=True,transform=apply_transform)
test_dataset = torchvision.datasets.CIFAR10(root='../data/cifar100', train=False, download=True,transform=apply_transform)
train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=64, num_workers=2,
pin_memory=True,shuffle=True)
test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=64, num_workers=2,
pin_memory=True,shuffle=False)
#定義損失函數和優化器
criterion = torch.nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(net.parameters(), lr=0.001,weight_decay=5e-4)
#獲取設備:如果有gpu就使用gpu,否則使用cpu
device = torch.device('cuda'if torch.cuda.is_available() else 'cpu')
net = net.to(device) # 簡單通過.to(device), 數據或模型就可以轉移至GPU
#訓練模型
print('training on: ',device)
def test():
net.eval()
acc = 0.0
sum = 0.0
loss_sum = 0
for batch, (data, target) in enumerate(test_loader):
data, target = data.to(device), target.to(device)
output = net(data)
loss = criterion(output, target)
acc+=torch.sum(torch.argmax(output,dim=1)==target).item()
sum+=len(target)
loss_sum+=loss.item()
print('test acc: %.2f%%, loss: %.4f'%(100*acc/sum, loss_sum/(batch+1)))
def train():
net.train()
acc = 0.0
sum = 0.0
loss_sum = 0
for batch, (data, target) in enumerate(train_loader):
data, target = data.to(device), target.to(device)
optimizer.zero_grad()
output = net(data)
loss = criterion(output, target)
loss.backward()
optimizer.step()
acc +=torch.sum(torch.argmax(output,dim=1)==target).item()
sum+=len(target)
loss_sum+=loss.item()
if batch%200==0:
print('\tbatch: %d, loss: %.4f'%(batch, loss.item()))
print('train acc: %.2f%%, loss: %.4f'%(100*acc/sum, loss_sum/(batch+1)))
## 開始訓練模型
for epoch in range(5):
print('epoch: %d'%epoch)
train()
test()
可以通過device = torch.device(‘cuda’if torch.cuda.is_available() else ‘cpu’)分別修改相應的運算設備gpu或者cpu, 對比使用cpu、gpu資源占用的變化:
同一超參數下模型預測效果上面來看兩者差不多,但運行時間CPU是GPU的5倍左右,GPU對深度學習訓練的效率提升還是很明顯的!
###################
training on: cpu
epoch: 0
batch: 0, loss: 4.5887
batch: 200, loss: 1.5186
batch: 400, loss: 1.3614
batch: 600, loss: 1.2306
train acc: 42.96%, loss: 1.5834
test acc: 54.61%, loss: 1.2249
# 耗時Wall time: 18min 27s
###################
training on: cuda
epoch: 0
batch: 0, loss: 4.6759
batch: 200, loss: 1.5816
batch: 400, loss: 1.6414
batch: 600, loss: 1.2504
train acc: 43.72%, loss: 1.5647
test acc: 53.02%, loss: 1.2784
# 耗時 Wall time: 3min 22s
文章轉自微信公眾號@算法進階