在AI Studio上部署外部可以直接調用的云端服務
簡 介:
按照 百度上的快速部署的兩個平臺:EasyDL以及AI Studio體驗館 的例子,對于在云端部署可以直接調用的服務進行了測試。但最后沒有能夠測試成功。后面還需要通過具體的例子來測試完整進行AI Studio云端服務的功能。
關鍵詞:
Paddle,云端服務
部署應用
文章目錄
簡單模型
樣本
建立BP網絡
建立數據加載對象
構建網絡
訓練網絡
驗證網絡
部署應用
轉換模型
部署過程
總 結
部署應用
文章目錄
簡單模型
樣本
建立BP網絡
建立數據加載對象
構建網絡
訓練網絡
驗證網絡
部署應用
轉換模型
部署過程
總 結
對
于一個訓練好的模型,直接部署在云端可以減少對于局部運算資源的需求。這在一些局域網絡通訊條件良好的情況下是快速驗證和系統搭建的方式。
在 百度上的快速部署的兩個平臺:EasyDL以及AI Studio體驗館 中按照說明初步測試了 Ai Studio 中的趣味體驗館的搭建過程,不過最終測試結果并沒有完成通過。下面計劃使用一個更加簡單的模型進行搭建,熟悉網絡部署的過程。
1.1 簡單模型
這個簡單模型是使用單層的BP網絡來實現 2021年人工神經網絡第三題:函數逼近
1.1.1 樣本
from headm import * # = from mpl_toolkits.mplot3d import Axes3D def fxy(x,y): return 3*(1-x)**2*exp(-(x**2+(y+1)**2))+\ 10*(x/5-x**3-y**5)*exp(-(x**2+y**2))-\ exp(-((x+1)**2+y**2))/3 grid_num = 100 x = linspace(-4,4,grid_num) y = linspace(-4,4,grid_num) x,y = meshgrid(x,y) xx = x.flatten() yy = y.flatten() ff = fxy(xx,yy).reshape(x.shape) ax = Axes3D(plt.figure(figsize=(12,8))) ax.plot_surface(x,y,ff, rstride=1, cstride=1, cmap=plt.cm.Blues) plt.show()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
1.2 建立BP網絡
1.2.1 建立數據加載對象
def fxy(x,y): return 3*(1-x)**2*exp(-(x**2+(y+1)**2))+\ 10*(x/5-x**3-y**5)*exp(-(x**2+y**2))-\ exp(-((x+1)**2+y**2))/3 grid_num = 100 x = linspace(-4,4,grid_num) y = linspace(-4,4,grid_num) x,y = meshgrid(x,y) xx = x.flatten() yy = y.flatten() ff = fxy(xx,yy) xy = array(list(zip(xx,yy))) print(shape(ff), shape(xy)) class Dataset(paddle.io.Dataset): def __init__(self, num_samples): super(Dataset, self).__init__() self.num_samples = num_samples def __getitem__(self, index): data = xy[index] label = ff[index] return paddle.to_tensor(data,dtype='float32'), paddle.to_tensor(label,dtype='float32') def __len__(self): return self.num_samples _dataset = Dataset(len(ff)) train_loader = paddle.io.DataLoader(_dataset, batch_size=1000, shuffle=True)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
data = train_loader().next() print("data: {}".format(data))
1
2
data: [Tensor(shape=[10, 2], dtype=float32, place=CPUPlace, stop_gradient=True, [[ 0.52525252, -3.19191909], [-1.57575762, 1.73737371], [ 3.27272725, -1.73737371], [ 4. , 2.78787875], [ 2.14141417, -2.38383842], [-3.35353541, 2.94949484], [ 0.68686867, -0.52525252], [ 1.73737371, -2.70707059], [ 2.30303025, -2.14141417], [ 3.83838391, -0.28282827]]), Tensor(shape=[10, 1], dtype=float32, place=CPUPlace, stop_gradient=True, [[ 0.09874938], [-0.50992441], [-0.00000177], [-0.00000011], [ 0.02933590], [-0.00000427], [-0.56279999], [ 0.04941760], [ 0.02375283], [-0.00019992]])]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
1.2.2 構建網絡
class bpnn(paddle.nn.Layer): def __init__(self, ): super(bpnn, self).__init__() self.L1 = paddle.nn.Linear(in_features=2, out_features=120) self.L2 = paddle.nn.Linear(in_features=120, out_features=1) def forward(self, x): x = self.L1(x) x = paddle.nn.functional.sigmoid(x) x = self.L2(x) return x model = bpnn()
1
2
3
4
5
6
7
8
9
10
11
12
13
--------------------------------------------------------------------------- Layer (type) Input Shape Output Shape Param # =========================================================================== Linear-1 [[1000, 2]] [1000, 120] 360 Linear-2 [[1000, 120]] [1000, 1] 121 =========================================================================== Total params: 481 Trainable params: 481 Non-trainable params: 0 --------------------------------------------------------------------------- Input size (MB): 0.01 Forward/backward pass size (MB): 0.92 Params size (MB): 0.00 Estimated Total Size (MB): 0.93 ---------------------------------------------------------------------------
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
1.2.3 訓練網絡
optimizer = paddle.optimizer.Adam(learning_rate=0.1, parameters=model.parameters()) def train(model): model.train() epochs = 50 for epoch in range(epochs): for batch, data in enumerate(train_loader()): out = model(data[0]) loss = paddle.nn.functional.square_error_cost(out, data[1]) acc = fluid.layers.mean(loss) loss.backward() optimizer.step() optimizer.clear_grad() print('Epoch:{}, Accuracys:{}'.format(epoch, acc.numpy())) train(model)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
paddle.summary(model, (1000,2)) paddle.save(model.state_dict(), './work/model.pdparams')
1
2
1.2.4 驗證網絡
class bpnn(paddle.nn.Layer): def __init__(self, ): super(bpnn, self).__init__() self.L1 = paddle.nn.Linear(in_features=2, out_features=120) self.L2 = paddle.nn.Linear(in_features=120, out_features=1) def forward(self, x): x = self.L1(x) x = paddle.nn.functional.sigmoid(x) x = self.L2(x) return xa model = bpnn() model.set_state_dict(paddle.load('./work/model.pdparams')) out = model(paddle.to_tensor(xy, dtype=float32)).numpy()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
outdif = out.flatten() - ff print(shape(outdif), shape(out), shape(ff)) errff = outdif.reshape(x.shape) ax = Axes3D(plt.figure(figsize=(12,8))) ax.plot_surface(x,y,errff, rstride=1, cstride=1, cmap=plt.cm.Blues) plt.show()
1
2
3
4
5
6
7
8
9
10
11
1.3 部署應用
參考Paddle相關的資料: 模型保存與載入
根據 百度上的快速部署的兩個平臺:EasyDL以及AI Studio體驗館 介紹的 模型部署流程 中的內容,需要將模型轉換成靜態模型。
1.3.1 轉換模型
在 PaddlePaddle文檔:動態圖轉靜態圖 給出了動態圖轉換成靜態圖的方法。
在深度學習模型構建上,飛槳框架支持動態圖編程和靜態圖編程兩種方式,其代碼編寫和執行方式均存在差異。
動態圖編程: 采用 Python 的編程風格,解析式地執行每一行網絡代碼,并同時返回計算結果。在 模型開發 章節中,介紹的都是動態圖編程方式。
靜態圖編程: 采用先編譯后執行的方式。需先在代碼中預定義完整的神經網絡結構,飛槳框架會將神經網絡描述為 Program 的數據結構,并對 Program 進行編譯優化,再調用執行器獲得計算結果。
動態圖編程體驗更佳、更易調試,但是因為采用 Python 實時執行的方式,開銷較大,在性能方面與 C++ 有一定差距;靜態圖調試難度大,但是將前端 Python 編寫的神經網絡預定義為 Program描述,轉到 C++ 端重新解析執行,脫離了 Python 依賴,往往執行性能更佳,并且預先擁有完整網絡結構也更利于全局優化。
飛槳框架在設計時,考慮同時兼顧動態圖的高易用性和靜態圖的高性能優勢,采用『動靜統一』的方案:
在模型開發時,推薦采用動態圖編程。 可獲得更好的編程體驗、更易用的接口、更友好的調試交互機制。
在模型訓練或者推理部署時,只需添加一行裝飾器 @to_static,即可將動態圖代碼轉寫為靜態圖代碼,并在底層自動使用靜態圖執行器運行。 可獲得更好的模型運行性能。
方案如下圖所示:
import paddle from paddle.jit import to_static class SimpleNet(paddle.nn.Layer): def __init__(self): super(SimpleNet, self).__init__() self.linear = paddle.nn.Linear(10, 3) @to_static # 動靜轉換 def forward(self, x, y): out = self.linear(x) out = out + y return out net = SimpleNet() net.eval() x = paddle.rand([2, 10]) y = paddle.rand([2, 3]) out = net(x, y) paddle.jit.save(net, './net')
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import paddle from paddle.jit import to_static class SimpleNet(paddle.nn.Layer): def __init__(self): super(SimpleNet, self).__init__() self.linear = paddle.nn.Linear(10, 3) def forward(self, x, y): out = self.linear(x) out = out + y return out net = SimpleNet() net.eval() net = paddle.jit.to_static(net) # 動靜轉換 x = paddle.rand([2, 10]) y = paddle.rand([2, 3]) out = net(x, y) paddle.jit.save(net, './net')
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
注意, 在paddle.jit.save() 直接需要通過 net.eval(),以及后面的out=net(x,y)能夠進行input_spec。否則就會出錯。
import paddle from paddle.jit import to_static class bpnn(paddle.nn.Layer): def __init__(self, ): super(bpnn, self).__init__() self.L1 = paddle.nn.Linear(in_features=2, out_features=120) self.L2 = paddle.nn.Linear(in_features=120, out_features=1) def forward(self, x): x = self.L1(x) x = paddle.nn.functional.sigmoid(x) x = self.L2(x) return x model = bpnn() model.set_state_dict(paddle.load('./work/model.pdparams')) model = paddle.jit.to_static(model) out = model(paddle.rand([2,2])) print("out: {}".format(out)) paddle.jit.save(model, '/home/aistudio/work/net')
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
1.3.2 部署過程
在具體按照 百度上的快速部署的兩個平臺:EasyDL以及AI Studio體驗館 不說AI Studio體驗館的過程中,發現仍然出現了測試錯誤。
按
照 百度上的快速部署的兩個平臺:EasyDL以及AI Studio體驗館 的例子,對于在云端部署可以直接調用的服務進行了測試。但最后沒有能夠測試成功。后面還需要通過具體的例子來測試完整進行AI Studio云端服務的功能。
■ 相關文獻鏈接:
百度上的快速部署的兩個平臺:EasyDL以及AI Studio體驗館
2021年人工神經網絡第一次作業要求
模型保存與載入
百度上的快速部署的兩個平臺:EasyDL以及AI Studio體驗館
PaddlePaddle文檔:動態圖轉靜態圖
● 相關圖表鏈接:
圖1.1.1 二維函數的3D圖像
圖1.1.2 二維函數圖像模型
圖1.1.3 二維函數圖像模型
圖1.2.1 原始數據,恢復數據以及數據誤差
圖1.3.1 飛槳框架動靜統一方案
圖1.3.2 動靜轉換模式
AI
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。