python網(wǎng)站開(kāi)發(fā)代碼成功營(yíng)銷案例分享
實(shí)踐學(xué)習(xí)PaddleScience飛槳科學(xué)工具包
動(dòng)手實(shí)踐,在實(shí)踐中學(xué)習(xí)!本項(xiàng)目可以在AIStudio平臺(tái)一鍵運(yùn)行!地址:https://aistudio.baidu.com/projectdetail/4278591 本項(xiàng)目第一次執(zhí)行會(huì)報(bào)錯(cuò),再執(zhí)行一次即可。若碰到莫名其妙的報(bào)錯(cuò),換成32G顯存環(huán)境試試。
要平視愛(ài)因斯坦和牛頓
愛(ài)因斯坦和牛頓也是普通人,也有認(rèn)識(shí)不到的地方,不要盲目崇拜,也不要一味否定前人的實(shí)踐,而要對(duì)前人的成果,尊重客觀事實(shí),辯證的一分為二的學(xué)習(xí)、實(shí)踐和吸收,要站在牛頓和愛(ài)因斯坦的肩膀上,與他們平視。 --張永德(原話記錄,有些許異同)
AIStudio和飛槳科學(xué)工具包,溝通理論和實(shí)踐,讓我們與頂級(jí)科學(xué)家站在同一起跑線上!
一、PaddleScience飛槳科學(xué)工具包簡(jiǎn)介
官網(wǎng)github地址:https://github.com/PaddlePaddle/PaddleScience
PaddleScience 使用可重用的軟件組件擴(kuò)展了 PaddlePaddle 框架,用于開(kāi)發(fā)新穎的科學(xué)計(jì)算應(yīng)用程序。此類新應(yīng)用包括基于物理的機(jī)器學(xué)習(xí)、基于神經(jīng)網(wǎng)絡(luò)的 PDE 求解器、CFD 機(jī)器學(xué)習(xí)等。PaddleScience 目前正在積極開(kāi)發(fā)中。它的設(shè)計(jì)不斷發(fā)展,其 API 可能會(huì)發(fā)生變化。
1、核心組件
核心功能和組織
PaddleScience 目前專注于 PINNs 模型。核心組件如下。
Geometry幾何學(xué),一個(gè)用于定義幾何域的聲明式接口。支持自動(dòng)離散化
Neural net神經(jīng)網(wǎng)絡(luò),目前支持可自定義大小和深度的全連接層。
PDE偏微分方程,以符號(hào)形式描繪偏微分方程。特定 PDE 派生基本 PDE 類。當(dāng)前包括兩個(gè)原生 PDE:Laplace2d 和 NavierStokes2d。
Loss損失,定義在訓(xùn)練過(guò)程中執(zhí)行的確切懲罰。默認(rèn)情況下,應(yīng)用 L2 損失。在目前的設(shè)計(jì)中,總損失是方程損失、邊界條件損失和初始條件損失三部分的加權(quán)和。
Optimizer優(yōu)化器,指定用于訓(xùn)練的優(yōu)化器。Adam 是默認(rèn)選項(xiàng)。未來(lái)將提供更多優(yōu)化器,例如 BFGS。
Solver求解器,以批處理方式管理給定訓(xùn)練數(shù)據(jù)的訓(xùn)練過(guò)程。
Visualization可視化,可輕松訪問(wèn)圖形繪制實(shí)用程序。
2、物理信息神經(jīng)網(wǎng)絡(luò)(PINN)簡(jiǎn)介
https://blog.csdn.net/jerry_liufeng/article/details/120727393
【PINN】基于物理信息的神經(jīng)網(wǎng)絡(luò) (Physics Informed Neural Network,簡(jiǎn)稱PINN) 是一種科學(xué)機(jī)器在傳統(tǒng)數(shù)值領(lǐng)域的應(yīng)用方法,特別是用于解決與偏微分方程 (PDE) 相關(guān)的各種問(wèn)題,包括方程求解、參數(shù)反演、模型發(fā)現(xiàn)、控制與優(yōu)化等。
大多數(shù)物理規(guī)律都可以表述為偏微分方程(PDE)的形式。偏微分方程,尤其是高階偏微分方程難以求解析解,通常是采用各種方式逼近從而獲得近似解。而神經(jīng)網(wǎng)絡(luò)的強(qiáng)大之處就在于其是萬(wàn)能近似器(universal approximator)
PaddlePaddle的神經(jīng)網(wǎng)絡(luò)核心是自動(dòng)微分,其實(shí)一個(gè)AI框架主要就是完成兩部分:1、Tensor張量的存儲(chǔ)與計(jì)算 2、自動(dòng)微分。
飛槳的自動(dòng)微分是通過(guò)trace的方式,記錄前向OP的執(zhí)行,并自動(dòng)創(chuàng)建反向var和添加相應(yīng)的反向OP,然后來(lái)實(shí)現(xiàn)反向梯度計(jì)算的。
3、Vtk介紹
參見(jiàn):https://www.cnblogs.com/zhhfan/p/10312170.html
Vtk,(visualization toolkit)是一個(gè)開(kāi)源的免費(fèi)軟件系統(tǒng),主要用于三維計(jì)算機(jī)圖形學(xué)、圖像處理和可視化。Vtk是在面向?qū)ο笤淼幕A(chǔ)上設(shè)計(jì)和實(shí)現(xiàn)的,它的內(nèi)核是用C++構(gòu)建的,包含有大約250,000行代碼,2000多個(gè)類,還包含有幾個(gè)轉(zhuǎn)換界面,因此也可以自由的通過(guò)Java,Tcl/Tk和Python各種語(yǔ)言使用vtk。以下介紹VTK對(duì)于STL圖像的基本操作
基礎(chǔ)概念
- 數(shù)據(jù)源 resource: cone = vtk.vtkConeSource()
- 映射器 mapper:coneMapper = vtk.vtkPolyDataMapper()
- 映射器添加數(shù)據(jù)源: coneMapper.SetInput( cone.GetOutput() )
- 演員 actor: coneActor = vtk.vtkActor()
- 演員添加映射器:coneActor.SetMapper( coneMapper )
- 繪制器 renderer: vtk.vtkRenderer()
- 繪制器添加演員:renderer.AddActor( coneActor )
- 繪制窗口 win:vtk.vtkRenderWindow()
- 繪制窗口添加繪制器:renWin.AddRenderer( renderer )
- 窗口讀取繪制器生成的圖形: renWin.Render()
如何打開(kāi)vtp文件,見(jiàn)“相關(guān)問(wèn)題和技巧”部分。
二、飛槳科學(xué)工具包安裝
若只需要執(zhí)行例子里的.py文件,則只要加上環(huán)境變量即可%env PYTHONPATH=/home/aistudio/PaddleScience
。見(jiàn)實(shí)踐三部分。
若需要使用Notebook模式,進(jìn)行代碼分塊編寫和執(zhí)行,則需要安裝飛槳科學(xué)包,本項(xiàng)目里采用手寫setup.py安裝文件的方式,幫著飛槳科學(xué)工具包實(shí)現(xiàn)安裝功能。見(jiàn)實(shí)踐一和實(shí)踐二部分。
1、 環(huán)境設(shè)置
本項(xiàng)目第一個(gè)例子以notebook模式展示,因此需要安裝飛槳科學(xué)包,步驟會(huì)略顯繁瑣。
安裝相關(guān)庫(kù)文件
# 大約需要20秒
!pip install numpy scipy sympy matplotlib vtk pyevtk pandas wget visualdl
下載飛槳科學(xué)工具包源碼。
源碼中有例子可以用來(lái)研究學(xué)習(xí)。
%cd ~/
# !pip install pip -U --user
!git clone https://github.com/PaddlePaddle/PaddleScience # 下載代碼
# 更新軟件,可不執(zhí)行
# !cd ~/PaddleScience/ && git pull
寫安裝配置文件
因?yàn)樵渲梦募邪膸?kù)較多,在setup安裝時(shí)會(huì)卡住,所以單獨(dú)寫一個(gè)只有一個(gè)包的配置文件。
命令行運(yùn)行這步可省略。
%%writefile ~/PaddleScience/requirements_setup.txt
numpy
寫飛槳科學(xué)包setup.py安裝文件
setup安裝之后,就可以不局限于執(zhí)行路徑了。
命令行運(yùn)行這步可省略。
%%writefile ~/PaddleScience/setup.py
import setuptools
import subprocess
import ostry:version = (subprocess.check_output(["git", "describe", "--abbrev=0", "--tags"]).strip().decode("utf-8"))
except Exception as e:print("Could not get version tag. Defaulting to version 0")version = "0"with open("requirements_setup.txt") as f:requirements = f.read().splitlines()if __name__ == "__main__":with open("README.md", "r") as fh:long_description = fh.read()setuptools.setup(name="paddlescience",version=version,author="PaddlePaddle",author_email="xxxx@baidu.com",description="paddlescience",long_description=long_description,long_description_content_type="text/markdown",url=" ",classifiers=["Programming Language :: Python :: 3","Operating System :: POSIX :: Linux","License :: OSI Approved :: MIT License",],packages=setuptools.find_packages(include=["paddlescience*"], exclude=[]),# package_data={"torchmd": ["config.ini", "logging.ini"],},install_requires=requirements,)
2、使用setup安裝PaddleScience
使用命令python setup.py install
, 其中的setup.py文件就是我們前面寫的那個(gè)文件。
也可以使用開(kāi)發(fā)模式命令是python setup.py develop
命令行運(yùn)行這步可省略。
!cd /home/aistudio/PaddleScience/ && python setup.py install
驗(yàn)證
測(cè)試一下,看飛槳科學(xué)工具包是否安裝成功。第一次執(zhí)行可能報(bào)錯(cuò),重啟環(huán)境(使setup生效)再次運(yùn)行即可。
沒(méi)有error報(bào)錯(cuò)則證明安裝成功!
命令行運(yùn)行這步可省略。
# 第一次執(zhí)行可能報(bào)錯(cuò),重啟環(huán)境(使setup生效)再次運(yùn)行即可。
import paddlescience
三、實(shí)踐1、頂蓋驅(qū)動(dòng)型腔流
本指南介紹了如何構(gòu)建 PINN 模型來(lái)模擬 PaddleScience 中的 2d Lid Driven Cavity (LDC) 流動(dòng)。
1、介紹
LDC 問(wèn)題模擬了一個(gè)充滿液體的容器,其中蓋子以恒定速度沿水平方向移動(dòng)。目標(biāo)是計(jì)算系統(tǒng)處于穩(wěn)態(tài)時(shí)容器中每個(gè)內(nèi)部點(diǎn)的液體速度。
下圖顯示了訓(xùn)練 100 x 100 網(wǎng)格生成的結(jié)果。分別顯示速度的垂直和水平分量。


2、如何構(gòu)建PINN模型
PINN 模型由過(guò)去的傳統(tǒng) PDE 設(shè)置和近似解的神經(jīng)網(wǎng)絡(luò)共同組成。PDE 部分包括執(zhí)行物理定律的特定微分方程、限定問(wèn)題域的幾何形狀以及可以找到解決方案的初始和邊界值條件。神經(jīng)網(wǎng)絡(luò)部分可以采用深度學(xué)習(xí)工具包中廣泛存在的典型前饋網(wǎng)絡(luò)的變體。
要獲得 PINN 模型,需要訓(xùn)練神經(jīng)網(wǎng)絡(luò)。正是在這個(gè)階段,PDE 的信息通過(guò)反向傳播被灌輸?shù)缴窠?jīng)網(wǎng)絡(luò)中。損失函數(shù)在控制如何分配這些信息方面起著至關(guān)重要的作用,強(qiáng)調(diào) PDE 的不同方面,例如,通過(guò)調(diào)整方程殘差和邊界值的權(quán)重。
概念明確后,接下來(lái)讓我們看一下如何將其轉(zhuǎn)換為 ldc2d 示例。
3、構(gòu)造幾何體psci.geometry
首先,使用模塊接口定義問(wèn)題幾何體。在此示例中,幾何體是一個(gè)矩形,其原點(diǎn)位于坐標(biāo) (-0.05, -0.05),范圍設(shè)置為 (0.05, 0.05)。
# %cd ~/PaddleScience/
import paddlescience as psci
import numpy as npgeo = psci.geometry.Rectangular(origin=(-0.05, -0.05), extent=(0.05, 0.05))
接下來(lái),為幾何圖形添加邊界,這些邊界將在 PDE 中使用。請(qǐng)注意,該geo.add_boundary函數(shù)僅用于具有物理約束的邊界。
geo.add_boundary(name="top", criteria=lambda x, y: abs(y - 0.05) < 1e-5)
geo.add_boundary(name="down", criteria=lambda x, y: abs(y + 0.05) < 1e-5)
geo.add_boundary(name="left", criteria=lambda x, y: abs(x + 0.05) < 1e-5)
geo.add_boundary(name="right", criteria=lambda x, y: abs(x - 0.05) < 1e-5)
準(zhǔn)備好域后,給出離散化方法。
npoints = 10201
geo_disc = geo.discretize(npoints=npoints, method="uniform")
4、構(gòu)建偏微分方程
定義幾何部分后,定義要求解的 PDE 方程。在本例中,方程是 2d Navier Stokes。這個(gè)方程存在于科學(xué)工具包中,只需要?jiǎng)?chuàng)建一個(gè)psci.pde.NavierStokes對(duì)象來(lái)設(shè)置方程。
pde = psci.pde.NavierStokes(nu=0.01, rho=1.0, dim=2, time_dependent=False, weight=0.0001)
接下來(lái),為 PDE 添加邊界方程。PDE 中的邊界方程與幾何中的邊界定義密切相關(guān)。使用pde.add_bc設(shè)置邊界上的物理信息.
weight_top_u = lambda x, y: 1.0 - 20.0 * abs(x)
bc_top_u = psci.bc.Dirichlet('u', rhs=1.0, weight=weight_top_u)
bc_top_v = psci.bc.Dirichlet('v', rhs=0.0)
bc_down_u = psci.bc.Dirichlet('u', rhs=0.0)
bc_down_v = psci.bc.Dirichlet('v', rhs=0.0)
bc_left_u = psci.bc.Dirichlet('u', rhs=0.0)
bc_left_v = psci.bc.Dirichlet('v', rhs=0.0)
bc_right_u = psci.bc.Dirichlet('u', rhs=0.0)
bc_right_v = psci.bc.Dirichlet('v', rhs=0.0)pde.add_bc("top", bc_top_u, bc_top_v)
pde.add_bc("down", bc_down_u, bc_down_v)
pde.add_bc("left", bc_left_u, bc_left_v)
pde.add_bc("right", bc_right_u, bc_right_v)
一旦準(zhǔn)備好方程和問(wèn)題域,就應(yīng)該給出離散化方法。此方法將用于在訓(xùn)練開(kāi)始之前生成訓(xùn)練數(shù)據(jù)。目前,可以將二維空間離散化為 N×M 網(wǎng)格,在本例中具體為 101×101。
pde_disc = pde.discretize(geo_disc=geo_disc)
5、構(gòu)建神經(jīng)網(wǎng)絡(luò)
現(xiàn)在 PDE 部分幾乎完成了,我們繼續(xù)構(gòu)建神經(jīng)網(wǎng)絡(luò)。通過(guò)創(chuàng)建psci.network.FCNet對(duì)象來(lái)定義完全連接的網(wǎng)絡(luò)很簡(jiǎn)單。以下是我們?nèi)绾蝿?chuàng)建一個(gè)由 10 個(gè)隱藏層組成的 FFN,每個(gè)隱藏層有 20 個(gè)神經(jīng)元,使用雙曲正切作為激活函數(shù)。
net = psci.network.FCNet(num_ins=2,num_outs=3,num_layers=10,hidden_size=20,activation='tanh')
接下來(lái),最重要的步驟之一是定義損失函數(shù)。這里我們使用 L2 損失。
loss = psci.loss.L2(p=2)
通過(guò)設(shè)計(jì),該loss對(duì)象傳達(dá)了 PDE 的完整信息?,F(xiàn)在結(jié)合神經(jīng)網(wǎng)絡(luò)和損失,我們創(chuàng)建psci.algorithm.PINNs模型算法。
algo = psci.algorithm.PINNs(net=net, loss=loss)
接下來(lái),通過(guò)插入 Adam 優(yōu)化器,構(gòu)建求解器,就可以開(kāi)始訓(xùn)練了。在此示例中,使用了 Adam 優(yōu)化器,并給出了 0.001 的學(xué)習(xí)率。
該類將此處psci.solver.Solver調(diào)用的 PINNs 模型和優(yōu)化器捆綁到公開(kāi)接口 algo的求解器對(duì)象中。接受一個(gè)關(guān)鍵字參數(shù),指定每個(gè)批次的 epoch 數(shù)。
# 300epoch 用時(shí)40秒。30000估計(jì)用時(shí)4000秒,約一小時(shí)7分鐘
opt = psci.optimizer.Adam(learning_rate=0.001, parameters=net.parameters())
solver = psci.solver.Solver(pde=pde_disc, algo=algo, opt=opt)
solution = solver.solve(num_epoch=3000) # 30000
最后,solver.solve返回一個(gè)函數(shù),該函數(shù)計(jì)算幾何中給定點(diǎn)的解值。將該函數(shù)應(yīng)用于幾何,將輸出轉(zhuǎn)換為 Numpy,然后您可以驗(yàn)證結(jié)果。
psci.visu.save_vtk是一個(gè)快速可視化的輔助工具。它將圖形保存在 vtp 文件中,可以使用Paraview播放。
psci.visu.save_vtk(geo_disc=pde_disc.geometry, data=solution)
# psci.visu.save_vtk(
# time_array=pde_disc.time_array, geo_disc=pde_disc.geometry, data=solution)
##6、 這樣頂蓋驅(qū)動(dòng)型腔流訓(xùn)練就完成了
期間碰到過(guò)從第435個(gè)開(kāi)始None的問(wèn)題,新飛槳版本已解決該問(wèn)題。
epoch/num_epoch: 434 / 30000 batch/num_batch: 1 / 1 loss: 66.1305 eq_loss: 66.13051 bc_loss: 8.132067
epoch/num_epoch: 435 / 30000 batch/num_batch: 1 / 1 loss: nan eq_loss: nan bc_loss: nan
四、實(shí)踐2、多孔介質(zhì)中的達(dá)西流
# %cd ~/PaddleScience
import paddlescience as psci
import numpy as np
import paddle
1、構(gòu)造幾何psci.geometry
首先,使用模塊接口定義問(wèn)題幾何。在此示例中,幾何圖形是一個(gè)矩形,其原點(diǎn)位于坐標(biāo) (0.0, 0.0),范圍設(shè)置為 (1.0, 1.0)。
psci.config.set_dtype("float32")# ref solution
ref_sol = lambda x, y: np.sin(2.0 * np.pi * x) * np.cos(2.0 * np.pi * y)# ref rhs
ref_rhs = lambda x, y: 8.0 * np.pi**2 * np.sin(2.0 * np.pi * x) * np.cos(2.0 * np.pi * y)# set geometry and boundary
geo = psci.geometry.Rectangular(origin=(0.0, 0.0), extent=(1.0, 1.0))
接下來(lái),為幾何圖形添加邊界,這些邊界將在 PDE 中使用。請(qǐng)注意,該geo.add_boundary函數(shù)僅用于具有物理約束的邊界。
geo.add_boundary(name="top", criteria=lambda x, y: y == 1.0)
geo.add_boundary(name="down", criteria=lambda x, y: y == 0.0)
geo.add_boundary(name="left", criteria=lambda x, y: x == 0.0)
geo.add_boundary(name="right", criteria=lambda x, y: x == 1.0)
準(zhǔn)備好域后,應(yīng)給出離散化方法。
geo_disc = geo.discretize(npoints=npoints, method="uniform")
2、構(gòu)建偏微分方程
定義幾何部分后,定義要求解的 PDE 方程。在本例中,方程是 2d Poisson。這個(gè)方程存在于包中,只需要?jiǎng)?chuàng)建一個(gè)psci.pde.Poisson對(duì)象來(lái)設(shè)置方程。
pde = psci.pde.Poisson(dim=2, rhs=ref_rhs)
接下來(lái),為 PDE 添加邊界方程。PDE 中的邊界方程與幾何中的邊界定義密切相關(guān)。需要設(shè)置邊界上的物理信息,然后使用pde.add_bc.
bc_top = psci.bc.Dirichlet('u', rhs=ref_sol)
bc_down = psci.bc.Dirichlet('u', rhs=ref_sol)
bc_left = psci.bc.Dirichlet('u', rhs=ref_sol)
bc_right = psci.bc.Dirichlet('u', rhs=ref_sol)pde.add_bc("top", bc_top)
pde.add_bc("down", bc_down)
pde.add_bc("left", bc_left)
pde.add_bc("right", bc_right)
一旦準(zhǔn)備好方程和問(wèn)題域,就應(yīng)該給出離散化方法。此配方將用于在訓(xùn)練開(kāi)始之前生成訓(xùn)練數(shù)據(jù)。
pde_disc = pde.discretize(geo_disc=geo_disc)
3、構(gòu)建神經(jīng)網(wǎng)絡(luò)
現(xiàn)在 PDE 部分幾乎完成了,我們繼續(xù)構(gòu)建神經(jīng)網(wǎng)絡(luò)。通過(guò)創(chuàng)建psci.network.FCNet對(duì)象來(lái)定義完全連接的網(wǎng)絡(luò)很簡(jiǎn)單。以下是我們?nèi)绾问褂秒p曲正切作為激活函數(shù)創(chuàng)建一個(gè)由 5 個(gè)隱藏層組成的 FFN,每個(gè)隱藏層有 20 個(gè)神經(jīng)元。
net = psci.network.FCNet(num_ins=2, num_outs=1, num_layers=5, hidden_size=20, activation='tanh')
接下來(lái),最重要的步驟之一是定義損失函數(shù)。這里我們使用 L2 損失。
loss = psci.loss.L2()
通過(guò)設(shè)計(jì),該loss對(duì)象傳達(dá)了 PDE 的完整信息?,F(xiàn)在結(jié)合神經(jīng)網(wǎng)絡(luò)和損失,我們創(chuàng)建psci.algorithm.PINNs模型算法。
algo = psci.algorithm.PINNs(net=net, loss=loss)
接下來(lái),通過(guò)插入 Adam 優(yōu)化器,構(gòu)建求解器,您就可以開(kāi)始訓(xùn)練了。在此示例中,使用了 Adam 優(yōu)化器,并給出了 0.001 的學(xué)習(xí)率。
該類將此處psci.solver.Solver調(diào)用的 PINNs 模型和優(yōu)化器捆綁到公開(kāi)接口 algo的求解器對(duì)象中。接受一個(gè)關(guān)鍵字參數(shù),num_epoch指定每個(gè)批次的 epoch 數(shù)。
100epoch用時(shí)3秒,10000估計(jì)用時(shí)300秒。
opt = psci.optimizer.Adam(learning_rate=0.001, parameters=net.parameters())
solver = psci.solver.Solver(pde=pde_disc, algo=algo, opt=opt)
solution = solver.solve(num_epoch=10000) # 10000
最后,solver.solve返回一個(gè)函數(shù),該函數(shù)計(jì)算幾何中給定點(diǎn)的解值。將該函數(shù)應(yīng)用于幾何,將輸出轉(zhuǎn)換為 Numpy,然后您可以驗(yàn)證結(jié)果。
psci.visu.save_vtk是一個(gè)快速可視化的輔助工具。它將圖形保存在 vtp 文件中,可以使用Paraview播放。
psci.visu.save_vtk(geo_disc=pde_disc.geometry, data=solution)
# MSE
# TODO: solution array to dict: interior, bc
cord = pde_disc.geometry.interior
ref = ref_sol(cord[:, 0], cord[:, 1])
mse2 = np.linalg.norm(solution[0][:, 0] - ref, ord=2)**2n = 1
for cord in pde_disc.geometry.boundary.values():ref = ref_sol(cord[:, 0], cord[:, 1])mse2 += np.linalg.norm(solution[n][:, 0] - ref, ord=2)**2n += 1mse = mse2 / npointsprint("MSE is: ", mse)
五、實(shí)踐3、拉普拉斯方程
在 PaddleScience 中為簡(jiǎn)單的拉普拉斯方程構(gòu)建 PINN 模型。
若只需要訓(xùn)練.py文件,則可以省略上面所有的步驟,只需要完成下面三步即可:
-
安裝相關(guān)軟件包
!pip install numpy scipy sympy matplotlib vtk pyevtk pandas wget visualdl
-
設(shè)置環(huán)境變量
%env PYTHONPATH=/home/aistudio/PaddleScience
-
執(zhí)行訓(xùn)練程序
!cd ~/PaddleScience/examples/laplace && python laplace2d.py
# cpu 運(yùn)行5分鐘 新版本gpu下1分40秒。
# !pip install numpy scipy sympy matplotlib vtk pyevtk pandas wget visualdl
%env PYTHONPATH=/home/aistudio/PaddleScience
!cd ~/PaddleScience/examples/laplace && python laplace2d.py
輸出信息
epoch: 22 loss: 0.084736794 eq loss: 0.00025607698 bc loss: 0.0052932343 ic loss: 0.0 data loss: 0.0
epoch: 23 loss: 0.084736794 eq loss: 0.00025607698 bc loss: 0.0052932343 ic loss: 0.0 data loss: 0.0
epoch: 24 loss: 0.084736794 eq loss: 0.00025607698 bc loss: 0.0052932343 ic loss: 0.0 data loss: 0.0
epoch: 25 loss: 0.084736794 eq loss: 0.00025607698 bc loss: 0.0052932343 ic loss: 0.0 data loss: 0.0
MSE is: 4.461478115287425e-06
六、實(shí)踐4、3D繞柱
# 3d 繞柱 15分鐘1300epoch。 2000個(gè)epoch預(yù)計(jì)23分鐘 。
!cd ~/PaddleScience/examples/cylinder/3d_steady/ && python cylinder3d_steady.py
# 頂蓋驅(qū)動(dòng)型腔流 gpu 52分鐘
# !cd ~/PaddleScience/examples/ldc && python ldc2d_steady.py
# 多孔介質(zhì)中的達(dá)西流 gpu 6分38秒
# !cd ~/PaddleScience/examples/darcy/ && python darcy2d.py
七、問(wèn)題和技巧
如何打開(kāi)vtp文件
可以使用paraview打開(kāi)vtp文件。
這里也提供了一個(gè)readvtp.py文件,放在work目錄下。可以將這個(gè)文件和vtp文件都下載到本地,然后執(zhí)行python readvtp.py rslt_u.vtp
即可打開(kāi)該文件,是3d的哦,可以用鼠標(biāo)旋轉(zhuǎn)看看。 本機(jī)需要安裝vtk庫(kù)(pip install vtk)。
新版本科學(xué)工具包的存盤文件為vtu,不能用下面的小程序打開(kāi)(打開(kāi)后看不到東西)。需要安裝下載paraview來(lái)打開(kāi)。
%%writefile ~/work/readvtp.py
import vtkmodules.vtkInteractionStyle
# noinspection PyUnresolvedReferences
import vtkmodules.vtkRenderingOpenGL2
from vtkmodules.vtkCommonColor import vtkNamedColors
from vtkmodules.vtkIOXML import vtkXMLPolyDataReader
from vtkmodules.vtkRenderingCore import (vtkActor,vtkPolyDataMapper,vtkRenderWindow,vtkRenderWindowInteractor,vtkRenderer
)def get_program_parameters():import argparsedescription = 'Read a VTK XML PolyData file.'epilogue = ''''''parser = argparse.ArgumentParser(description=description, epilog=epilogue,formatter_class=argparse.RawDescriptionHelpFormatter)parser.add_argument('filename', help='horse.vtp.')args = parser.parse_args()return args.filenamedef main():colors = vtkNamedColors()filename = get_program_parameters()reader = vtkXMLPolyDataReader()reader.SetFileName(filename)reader.Update()mapper = vtkPolyDataMapper()mapper.SetInputConnection(reader.GetOutputPort())actor = vtkActor()actor.SetMapper(mapper)actor.GetProperty().SetColor(colors.GetColor3d('Tan'))# Create a rendering window and rendererren = vtkRenderer()renWin = vtkRenderWindow()renWin.AddRenderer(ren)renWin.SetWindowName('ReadVTP')# Create a renderwindowinteractoriren = vtkRenderWindowInteractor()iren.SetRenderWindow(renWin)# Assign actor to the rendererren.AddActor(actor)# Enable user interface interactoriren.Initialize()renWin.Render()ren.SetBackground(colors.GetColor3d('AliceBlue'))ren.GetActiveCamera().SetPosition(-0.5, 0.1, 0.0)ren.GetActiveCamera().SetViewUp(0.1, 0.0, 1.0)renWin.Render()iren.Start()if __name__ == '__main__':main()
八、調(diào)試糾錯(cuò)
報(bào)錯(cuò)cannot import name ‘jacobian’
import paddlescienc報(bào)錯(cuò):15 import paddle16 import paddle.nn.functional as F
---> 17 from paddle.autograd import jacobian, hessian, batch_jacobian, batch_hessian18 from ..pde import first_order_rslts, first_order_derivatives, second_order_derivatives19 from .loss_base import LossBase
ImportError: cannot import name 'jacobian' from 'paddle.autograd' (/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/paddle/autograd/__init__.py)
估計(jì)應(yīng)該用最新版本才可以!
安裝最新develop版本,問(wèn)題解決!
沒(méi)有版本ModuleNotFoundError: No module named ‘paddlescience’
要在科學(xué)工具包的根目錄執(zhí)行 ,把文件直接放在科學(xué)工具包根目錄然后執(zhí)行。
后期是采用setup安裝科學(xué)工具包的方式來(lái)解決路徑依賴問(wèn)題。
OSError: (External) CUBLAS error(7)
OSError: (External) CUBLAS error(7). [Hint: 'CUBLAS_STATUS_INVALID_VALUE'. An unsupported value or parameter was passed to the function (a negative vector size, for example). To correct: ensure that all the parameters being passed have valid values. ] (at /paddle/paddle/fluid/platform/device/gpu/cuda/cuda_helper.h:87)[operator < uniform_random > error]
飛槳版本出錯(cuò),因?yàn)槭乔袚Q到gpu環(huán)境,安裝的時(shí)候選了cuda11版本的飛槳,安裝后報(bào)錯(cuò)。
選擇飛槳cuda10.1版本的,就ok了
后期是采用系統(tǒng)自帶的飛槳2.3正式版本,就沒(méi)有安裝的煩惱了。
執(zhí)行python ldc2d.py的時(shí)候報(bào)錯(cuò)
epoch/num_epoch: 29999 / 30000 batch/num_batch: 1 / 1 loss: 0.83008355 eq_loss: 0.5134626 bc_loss: 0.652223
epoch/num_epoch: 30000 / 30000 batch/num_batch: 1 / 1 loss: 0.7781308 eq_loss: 0.47800368 bc_loss: 0.61400324
Traceback (most recent call last):File "ldc2d.py", line 97, in <module>openfoam_u = np.load("./openfoam/openfoam_u_100.npy")File "/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/numpy/lib/npyio.py", line 417, in loadfid = stack.enter_context(open(os_fspath(file), "rb"))
FileNotFoundError: [Errno 2] No such file or directory: './openfoam/openfoam_u_100.npy'
原來(lái)是還有一個(gè)目錄沒(méi)有cp到當(dāng)前目錄,使用命令cp -r examples/ldc2d/openfoam .
即可。
后期是采用setup安裝科學(xué)工具包來(lái)解決路徑依賴問(wèn)題。
報(bào)錯(cuò)unexpected keyword argument ‘space_steps’
---------------------------------------------------------------------------TypeError Traceback (most recent call last)/tmp/ipykernel_444/2834758931.py in <module>
----> 1 pdes, geo = psci.discretize(pdes, geo, space_steps=(101, 101))
TypeError: discretize() got an unexpected keyword argument 'space_steps'
原因是應(yīng)該是space_nsteps,命令為pdes, geo = psci.discretize(pdes, geo, space_steps=(101, 101))
,文檔有誤。
新版本已經(jīng)解決該問(wèn)題。
報(bào)錯(cuò)Received [3] in X is not equal to [2] in Y at i:1
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/paddle/fluid/dygraph/math_op_patch.py in __impl__(self, other_var)262 axis = -1263 math_op = getattr(_C_ops, op_type)
--> 264 return math_op(self, other_var, 'axis', axis)265 266 comment = OpProtoHolder.instance().get_op_proto(op_type).comment
ValueError: (InvalidArgument) Broadcast dimension mismatch. Operands could not be broadcast together with the shape of X = [400, 3] and the shape of Y = [400, 2]. Received [3] in X is not equal to [2] in Y at i:1.[Hint: Expected x_dims_array[i] == y_dims_array[i] || x_dims_array[i] <= 1 || y_dims_array[i] <= 1 == true, but received x_dims_array[i] == y_dims_array[i] || x_dims_array[i] <= 1 || y_dims_array[i] <= 1:0 != true:1.] (at /paddle/paddle/pten/kernels/hybird/general/elementwise_base.h:373)[operator < elementwise_sub > error]
解決方法,將pdes.set_bc_value(bc_value=bc_value)修改為:
pdes.set_bc_value(bc_value=bc_value, bc_check_dim=[0, 1])
30000步報(bào)None
epoch/num_epoch: 29999 / 30000 batch/num_batch: 1 / 1 loss: nan eq_loss: nan bc_loss: nan
epoch/num_epoch: 30000 / 30000 batch/num_batch: 1 / 1 loss: nan eq_loss: nan bc_loss: nan
MSE_u: nan
MSE_v: nan
MSE_u_400: nan
MSE_v_400: nan
通過(guò)報(bào)issue得知,換新的飛槳開(kāi)發(fā)版就好了。
最終飛槳2.3正式版之后的都可以。
環(huán)境變量設(shè)置問(wèn)題
在AIStudio notebook下環(huán)境變量設(shè)置有些坑,比如命令行下使用export PYTHONPATH=$PYTHONPATH:/home/aistudio/PaddleScience/
,然后就可以正常使用科學(xué)包了。而在notebook下,使用%env PYTHONPATH=$PYTHONPATH:/home/aistudio/PaddleScience/
或者env PYTHONPATH=/home/aistudio/PaddleScience/
都不能正常導(dǎo)入科學(xué)工具包,即import paddlescience會(huì)報(bào)錯(cuò)。
最終解決方法是寫setup.py文件,手動(dòng)安裝科學(xué)工具包。
報(bào)錯(cuò)hijack_call.c:658 cuInit error unknown error
!python laplace2d.py
報(bào)錯(cuò)
重啟,用飛槳2.3版本
報(bào)錯(cuò)No module named ‘sympy’
import sympy
ModuleNotFoundError: No module named 'sympy'
解決方法:使用AIStudio經(jīng)典版。即不使用BML版本。
結(jié)束語(yǔ)
用飛槳,劃時(shí)代!讓我們蕩起雙槳,在AI的海洋乘風(fēng)破浪!
飛槳官網(wǎng):https://www.paddlepaddle.org.cn
因?yàn)樗接邢?#xff0c;難免有不足之處,還請(qǐng)大家多多幫助。
作者:段春華, 網(wǎng)名skywalk 或 天馬行空,濟(jì)寧市極快軟件科技有限公司的AI架構(gòu)師,百度飛槳PPDE。
我在AI Studio上獲得至尊等級(jí),點(diǎn)亮11個(gè)徽章,來(lái)關(guān)注啊~ https://aistudio.baidu.com/aistudio/personalcenter/thirdview/141218