但是常發生明明輸入的檔案(初始結構與設定檔)與程式參數都一樣,但得到的結果沒有一模一樣!這是因為對於操作分子模擬軟體不夠熟稔,所以當以為做的事情都一樣時,其實還有一些很細的細節沒有弄到一模一樣。
因為分子模擬是一步一步跑出來,後面一步會根據前面一步的結果來得到,所以如果中間有一個小地方出現差異,這些不一樣的地方就會累積。根據GROMACS上面的文章《Reproducibility》與個人經驗,這邊列出那些可能會造成跑出來的結果沒有完全相同的細節:
- 分子模擬套件的版本不一樣
- 機器不一樣,像是CPU、主機板與記憶體的型號與次型號等等
- 作業系統不一樣;甚至是作業系統一樣、版本也一樣,但是Kernel不一樣
- 單精確度、雙精確度、或是混合兩者
- 處理器的數目。Number of processors, due to different order of addition of force. For instance (a+b)+c is not necessarily binary identical to a+(b+c).
- 處理器型號不同,會造成算出來結果的些微差距。
- 編譯過程不一樣,像是在編譯的時候最佳化程度的不同做出來的執行檔也會不一樣。
- 執行過程時候的最佳化。Optimizations at run time: e.g. the FFTW library that we use for fast Fourier transforms determines at startup which version of their algorithms is fastest, and uses that for the remainder of the calculations. Since the speed estimate is not deterministic, the results may vary from run to run. In GROMACS versions prior to 3.3 this optimization could be turned off in the .mdp file.
- 在設定檔裡面會有隨機變數,有些參數的意思是隨機產生數字。簡單說,注意設定檔裡面seed這個關鍵字
- gen-vel與gen-seed:模擬一開始根據Maxwell distribution與預計模擬的溫度,搭配隨機變數種子產生原子的初始速度
- v-rescale與ld-seed:這是控制溫度的方式,但裡面會用到隨機變數,用來描述stochastic and Brownian dynamics的thermal noise
- lmc-mc-move與lmc-seed:跑蒙地卡羅法的時候用到的隨機變數產生種子
- 沒有初始化變數。Uninitialized variables in the code (but there shouldn't be any)
- 執行檔連結到的函式庫版本不一樣。Dynamic linking to different versions of shared libraries (e.g. for FFTs)
- 執行程式會自動調整負擔。Dynamic load balancing, since particles are redistributed to processors based on elapsed wallclock time, which will lead to (a+b)+c != a+(b+c) issues as above
- Number of PME-only nodes (for parallel PME simulations)
- MPI reductions typically do not guarantee the order of the operations, and so the absence of floating-point associativity means the result of a reduction depends on the order
如果真的上面所有的事情都考量到,卻在同一台機器無法得到相同的結果,那麼就會是硬體問題,或是身處宇宙射線很強的地方,造成記憶體上面的數據出問題。不過這是非常極端的狀況,即使發生了大多數人也都不會知道出問題,除非做模擬的人對自己的系統熟悉到可以判斷是電腦算錯,才有可能會抓出這種問題。
最後提個很有趣問題:如果說這些些微的改變就會造成結果的不同,那這樣分子模擬的結果可信嗎?
_EOF_
沒有留言:
張貼留言