MXNet安裝

日萌社

人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度學習實戰(不定時更新)


1.官網下載安裝:http://mxnet.incubator.apache.org/get_started

2.Window安裝GPU版本的MXNet
	http://mxnet.incubator.apache.org/get_started/windows_setup.html#install-with-nvidia-gpus

1.mxnet安裝
	1.方法一:Window裝的是CUDA 10.0、cuDNN v7.6.5.32,那麼可以選配安裝的是 mxnet-cu100==1.5.1

	2.方法二:官方MXNet文檔的安裝指引 https://zh.d2l.ai/chapter_prerequisite/install.html

2.d2lzh安裝
	方式一(建議):https://zh.d2l.ai/chapter_prerequisite/install.html

	方式二:https://pypi.org/project/d2lzh/ 可以查看安裝的d2lzh版本和命令
3.Python驗證安裝是否成功
	http://mxnet.incubator.apache.org/get_started/validate_mxnet#python

>>> import mxnet as mx
>>> a = mx.nd.ones((2, 3), mx.gpu())
>>> b = a * 2 + 1
>>> b.asnumpy()
array([[ 3.,  3.,  3.],
       [ 3.,  3.,  3.]], dtype=float32)


1.《動手學 深度學習》電子書:https://zh.d2l.ai/d2l-zh.pdf
2.《動手學 深度學習》官網:https://zh.d2l.ai/
3.《動手學 深度學習》github:https://github.com/d2l-ai/d2l-zh
4.《動手學 深度學習》代碼:https://zh.d2l.ai/d2l-zh-1.0.zip 
	創建文件夾“d2l-zh”並將d2l-zh-1.0.zip壓縮包解壓到這個文件夾

5.conda和pip默認使用國外站點來下載MXNet和相關軟件,我們可以配置國內鏡像來加速下載。配置清華PyPI鏡像(如無法運行,將pip版本升級到>=10.0.0)
	pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

6.安裝 GPU版的 MXNet
	1.d2l-zh-1.0.zip壓縮包解壓出來的文件有一個叫做environment.yml,文件信息包含要安裝的軟件和版本如下MXNet和d2lzh包及版本號:
                name: gluon
                dependencies:
                - python=3.6
                - pip:
                  - mxnet==1.4.0
                  - d2lzh==0.8.11
                  - jupyter==1.0.0
                  - matplotlib==2.2.2
                  - pandas==0.23.4

	2.參數解析:
		1.上述environment.yml文件中的“mxnet==1.4.0”代表的是 CPU版本的MXNet,安裝 GPU版的 MXNet之前 需要先安裝 CUDA、cuDNN。
	  	  environment.yml文件中的字符串“mxnet”替換成對應的GPU版本。例如,如果計算機上裝的是8.0版本的CUDA,將該文件中的字符串“mxnet”改爲“mxnet-cu80”。
	  	  如果計算機上安裝了其他版本的CUDA(如7.5、9.0、9.2等),對該文件中的字符串“mxnet”做類似修改(如改爲“mxnet-cu75”“mxnet-cu90”“mxnet-cu92”等)。
	  	  保存environment.yml文件後退出。
 	  	2.name: gluon 表示要創建新的虛擬環境的名字gluon 

	3.比如我裝的是CUDA 9.0、cuDNN 7.1.4,然後把“mxnet==1.4.0”修改爲“mxnet-cu90==1.4.0”,environment.yml文件修改後如下MXNet和d2lzh包及版本號:
                name: gluon
                dependencies:
                - python=3.6
                - pip:
                  - mxnet-cu90==1.4.0
                  - d2lzh==0.8.11
                  - jupyter==1.0.0
                  - matplotlib==2.2.2
                  - pandas==0.23.4

	4.第一種安裝方式:不創建新的虛擬環境,而是直接手動下載安裝每個軟件。
	  	1.注意:可使用pip list 查看已經安裝了什麼軟件和對應的版本號,如果已經安裝了anaconda的話,則一般都已經自帶同時裝好了jupyter、matplotlib、pandas。	
		        如果已經裝好的軟件的本地低於要求的版本可進行更新安裝。
		        比如我的已經安裝好了 jupyter 1.0.0、matplotlib 2.2.2、pandas 0.23.0,那麼還僅需要安裝mxnet-cu90 1.4.0、d2lzh 0.8.11,
		        和把 pandas 0.23.0 更新爲 pandas 0.23.4,只需要執行 pip install pandas==0.23.4 即會自動卸載舊版本0.23.0 然後安裝 0.23.4版本的了。

	  	2.需要安裝的 軟件和版本號如下:注意根據自己的cuda版本安裝對應的GPU版本的mxnet-cuxx==1.4.0
		  pip 安裝方式:
			pip install mxnet-cu90==1.4.0
			pip install d2lzh==0.8.11
			pip install jupyter==1.0.0
			pip install matplotlib==2.2.2
			pip install pandas==0.23.4
		  conda 安裝方式:
			conda install mxnet-cu90==1.4.0
			conda install d2lzh==0.8.11
			conda install jupyter==1.0.0
			conda install matplotlib==2.2.2
			conda install pandas==0.23.4

	5.第二種安裝方式:根據提供的 environment.yml文件直接進行創建虛擬環境gluon和下載安裝對應版本的軟件。
		執行命令 conda env create -f environment.yml 表示用配置文件創建新的虛擬環境,該虛擬環境的名字爲environment.yml文件中所配置的 name: gluon。
	  	創建虛擬環境gluon的時候,會自動根據environment.yml文件所配置的軟件和版本進行下載安裝到當前的虛擬環境gluon中。
	  	若使用國內鏡像後出現安裝錯誤,首先取消PyPI鏡像配置,即執行命令pip config unset global.index-url。然後重試命令conda env create -f environment.yml。
	  	激活虛擬環境gluon:conda activate gluon  # 若conda版本低於4.4,使用命令activate gluon

7.測試
	1.MXNet可以指定用來計算和存儲的設備。默認情況下,MXNet會將數據創建在內存,然後利用CPU來計算。
	2.在MXNet中,mx.cpu()/mx.cpu(任意整數) 都均表示所有的物理CPU和內存。這意味着,MXNet的計算會盡量使用所有的CPU核。mx.cpu()等價於mx.cpu(0)。
	  比如其中“cpu(0)”⾥的0沒有特別的意義,並不代表特定的核。
	3.在MXNet中,mx.gpu()/mx.gpu(任意整數) 表示第i塊GPU及相應的顯存(i從0開始),並且mx.gpu(0)和mx.gpu()等價。
 	4.MXNet的計算會在輸入數據的context屬性所指定的cpu/gpu設備上執行。爲了使用GPU計算,我們只需要事先將所有的輸入數據存儲到顯存上,
	  計算輸出結果也會自動會保存在顯存上。同樣的,要計算的所有輸入數據都在cpu上的話,那麼輸出的結果數據也會存儲在cpu上。
	  因此MXNet要求計算的所有輸入數據要麼都在內存上,或者要麼都在顯存上。如果要計算的一部分數據在cpu上,一部分在gpu上,是無法計算的。	
	5.例子
			import mxnet as mx
			from mxnet import nd
			from mxnet.gluon import nn

			#cpu(數字):數字並沒有特別的意義,並不代表特定的核
			#gpu(數字):表示第i塊GPU及相應的顯存(i從0開始),並且mx.gpu(0)和mx.gpu()等價
			mx.cpu(), mx.gpu(), mx.gpu(0)
			Out[5]: (cpu(0), gpu(0), gpu(0))

			mx.cpu(1), mx.gpu(2), mx.gpu(0)
			Out[6]: (cpu(1), gpu(2), gpu(0))

			#在默認情況下,NDArray存在內存上。
			x = nd.array([1, 2, 3])
			x
			Out[2]: [1. 2. 3.]
				<NDArray 3 @cpu(0)>
					
			#可以通過NDArray的context屬性來查看該NDArray存儲在cpu/gpu設備
			x.context
			Out[3]: cpu(0)

			#可以在創建NDArray的時候通過ctx參數指定存儲在cpu/gpu設備
			#只能填mx.gpu()和mx.gpu(0),填其他數字會報錯CUDA: invalid device ordinal
			a = nd.array([1, 2, 3], ctx=mx.gpu())
			a
			Out[4]: [1. 2. 3.]
				<NDArray 3 @gpu(0)>
					
			a.context
			Out[5]: gpu(0)
			 
			#可以在創建NDArray的時候通過ctx參數指定存儲在cpu/gpu設備
			#mx.cpu()和mx.cpu(任意數字)都沒有特殊意義,並都不代表特定的核
			b = nd.array([1, 2, 3], ctx=mx.cpu())
			b
			Out[6]: [1. 2. 3.]
				<NDArray 3 @cpu(0)>
					 
			b.context
			Out[7]: cpu(0)
 
			#可以通過copyto(mx.cpu()/mx.gpu())和as_in_context(mx.cpu()/mx.gpu()) 在cpu/gpu兩種設備之間傳輸數據
			#NDArray對象x在cpu上,下面通過copyto(mx.gpu())把x從cpu拷貝一份傳輸到gpu上
			y1 = x.copyto(mx.gpu())
			y1 
			Out[36]: [1. 2. 3.]
				<NDArray 3 @gpu(0)>

			y1.context
			Out[37]: gpu(0)

			#可以通過copyto(mx.cpu()/mx.gpu())和as_in_context(mx.cpu()/mx.gpu()) 在cpu/gpu兩種設備之間傳輸數據
			#NDArray對象y1在gpu上,下面通過copyto(mx.cpu())把y1從gpu拷貝一份傳輸到cpu上
			x1 = y1.copyto(mx.cpu())
			x1
			Out[52]: [1. 2. 3.]
				 <NDArray 3 @cpu(0)>

			x1.context
			Out[53]: cpu(0)
			 
			#可以通過copyto(mx.cpu()/mx.gpu())和as_in_context(mx.cpu()/mx.gpu()) 在cpu/gpu兩種設備之間傳輸數據
			#NDArray對象x在cpu上,下面通過as_in_context(mx.gpu())把x從cpu拷貝一份傳輸到gpu上
			y1 = x.as_in_context(mx.gpu())
			y1
			Out[41]: [1. 2. 3.]
				 <NDArray 3 @gpu(0)>

			y1.context
			Out[42]: gpu(0)

			#可以通過copyto(mx.cpu()/mx.gpu())和as_in_context(mx.cpu()/mx.gpu()) 在cpu/gpu兩種設備之間傳輸數據
			#NDArray對象y2在gpu上,下面通過as_in_context(mx.cpu())把y2從gpu拷貝一份傳輸到cpu上
			x2 = y2.as_in_context(mx.cpu())
			x2
			Out[56]: [1. 2. 3.]
				 <NDArray 3 @cpu(0)>

			x2.context
			Out[57]: cpu(0)
			 
			#如果輸入變量和通過as_in_context輸出的變量都在同一個cpu或同一個gpu上的話,那麼會共享使用同一份內存或顯存
			#下面輸入變量y在gpu上,和通過as_in_context(mx.gpu())輸出的變量也同在gpu上,因此共享使用同一份顯存
			y.as_in_context(mx.gpu()) is y
			Out[45]: True

			#如果輸入變量和通過copyto輸出的變量都在同一個cpu或同一個gpu上的話,那麼實際不會共享使用同一份內存或顯存,copyto會爲輸出變量開闢新的內存或顯存
			#下面輸入變量y在gpu上,和通過copyto(mx.gpu())輸出的變量也同在gpu上,因此實際不會共享使用同一份顯存,copyto會爲輸出變量開闢新的顯存
			y.copyto(mx.gpu()) is y
			Out[47]: False

			#如果輸入變量和通過as_in_context輸出的變量都在同一個cpu或同一個gpu上的話,那麼會共享使用同一份內存或顯存
			#下面輸入變量x在cpu上,和通過as_in_context(mx.cpu())輸出的變量也同在cpu上,因此共享使用同一份內存
			x.as_in_context(mx.cpu()) is x
			Out[45]: True

			#如果輸入變量和通過copyto輸出的變量都在同一個cpu或同一個gpu上的話,那麼實際不會共享使用同一份內存或顯存,copyto會爲輸出變量開闢新的內存或顯存
			#下面輸入變量x在cpu上,和通過copyto(mx.cpu())輸出的變量也同在cpu上,因此實際不會共享使用同一份內存,copyto會爲輸出變量開闢新的內存
			x.copyto(mx.cpu()) is x
			Out[47]: False

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章