如果有使用 Raspberry pi 架設伺服器,但是 CPU 大部分時間空閒,可以考慮捐出來做學術研究,本篇以 Folding@home 為例,雖然 Raspberry pi 算力遠不及 x86 CPU,但就算只有一點點,也能幫助研究人員找出癌症、阿茲海默症、亨廷頓舞蹈症、牛海綿狀腦病,以及 COVID-19 的治療方法!
目錄
前言
Folding@home(簡稱FAH或F@h)是一個研究蛋白質摺疊、誤折、聚合及由此引起的相關疾病的分散式計算工程。由史丹福大學化學系的潘德實驗室(Pande Lab)主持,於2000年10月1日正式啟動。
Folding@home專注於精確地類比蛋白質折疊和錯誤折疊的過程,以便能更好地了解多種疾病的起因和發展,包括阿茲海默症、亨廷頓舞蹈症、牛海綿狀腦病(狂牛症、狂牛症)、癌症和囊胞性纖維症。到目前為止,Folding@home 已成功類比5—10微秒的折疊過程,超出先前估計可類比的時段數千倍。
以上摘錄自 Folding@home wiki 頁面。
記得小時第一次接觸到的分散式計算計劃是 SETI@home,那時是人生中第一台電腦 Pentium 200MHz,跑一個 task 可能就要好幾天。除了覺得能透過分散式計算,集合眾人(的電腦)之力來加速整個研究過程很神奇之外,也覺得跑分析的畫面很酷。這次在試 Folding@home 的時候本來想找來回憶一下,但 SETI@home 已經在 2020年3月2日關閉。
會突然想到在 Raspberry pi 上跑 Folding@home,主要是在看區塊鏈相關應用時,在想除了用算力挖礦之外,有沒有什麼方式能讓「算力」做更有意義的應用,此時 xxx@home 就浮現在我腦中。
研究了一下,這種計畫還不少,最後選擇 Folding@home 。因為他在解決目前人類難以克服的病症,於是試著讓他跑在 Raspberry pi 上。
好,前言廢話完畢,我們立刻進入正題!以下方法除了適用 Raspberry pi ,也適用於任何 arm base 的單板電腦,就讓我們一起來實作吧!
註:Raspberry pi 必須使用 64 bit 的 Raspberry pi OS,其他廠牌單板電腦 OS 通常已經上 64 bit
準備 Build image 所需檔案
製作 Folding@home 的 docker image 需要準備以下檔案
- Dockerfile
- sample-config.xml
- config.xml
Dockerfile 檔
首先上 Dockerfile
FROM ubuntu:21.04
ENV DEBIAN_FRONTEND noninteractive
RUN apt-get update && apt-get -y install \
curl \
bzip2
RUN curl -fL 'https://download.foldingathome.org/releases/public/release/fahclient/debian-stable-arm64/v7.6/fahclient_7.6.21_arm64.deb' > /fahclient.deb
# Install Folding@home
ADD sample-config.xml /usr/share/doc/fahclient/sample-config.xml
RUN dpkg -i /fahclient.deb
RUN rm /fahclient.deb
CMD FAHClient --config /etc/fahclient/config.xml
簡單解釋幾行的意義:
ENV DEBIAN_FRONTEND noninteractive
這一行因為 folding@home 在安裝過程中會詢問一些設定,可能發生錯誤導致 image build fail,所以用這行禁止互動介面。設定的部分則不用擔心,我們會透過掛設定檔的方式解決。
RUN curl -fL 'https://download.foldingathome.org/releases/public/release/fahclient/debian-stable-arm64/v7.6/fahclient_7.6.21_arm64.deb' > /fahclient.deb
這行是去官網把 arm edition 的 deb 安裝檔抓下來,未來如果有新版的話再自行替換網址(但我看他已經一兩年沒更新了)。
ADD sample-config.xml /usr/share/doc/fahclient/sample-config.xml
因為我們禁用互動介面,所以 folding@home 在安裝過程中需要 sample-config.xml 來初始化基本的設定(config.xml 在後面提供)。
Config 檔
以下是由 github 上找來的 sample-config.xml,可以先用這一份提供 docker build image,再另外複製一分修改成 config.xml 掛入使用。
<config>
<!-- See sample config: /usr/share/doc/fahclient/sample-config.xml -->
<!-- Client Control
Don't fold anonymously, provide user info. -->
<fold-anon v='false'/>
<!-- Folding Slot Configuration -->
<gpu v='true'/> <!-- If true, attempt to autoconfigure GPUs -->
<!-- Slot Control
Options: light, medium or full
Watch out for high load -->
<power v='light'/>
<user v=''/>
<passkey v=''/>
<team v=''/>
<!-- Folding Slots -->
<!-- Use all the CPUs
Watch out for high load -->
<slot id='0' type='CPU'/>
<slot id='1' type='GPU'/>
<!-- Grant Remote Web Access
access web UI at 192.168.1.63:7396 -->
<allow>127.0.0.1</allow>
<web-allow>127.0.0.1</web-allow>
</config>
解釋幾項 config 參數
- fold-anon:設定你是否匿名貢獻,如果 false 的話,需要提供 user 和 passkey
- user / passkey / team:如第一點,可以先到 Get a Folding@home Passkey申請一組填上,這樣積分就會歸到這個 user 。同時也可以參與 team 貢獻積分,到 Team Statistics 查詢 team id 後填上即可。
- power:用來控制 folding@home 能吃掉多少效能。實測用 container 跑時這個設定好像沒作用,後面會分享使用 docker 原生的設定來控制效能上限
- slot:設定能夠使用的 CPU 或 GPU
- gpu: 是否可以使用 GPU
- allow / web-allow:設定 web control 介面的 ip 白名單,可以使用區段的方式設定
以下是我的設定提供參考:
<config>
<!-- Folding Slot Configuration -->
<gpu v='false'/>
<!-- HTTP Server -->
<allow v='192.168.68.0/24'/>
<!-- Slot Control -->
<power v='FULL'/>
<!-- User Information -->
<passkey v='your passkey'/>
<team v='your team'/>
<user v='your user name'/>
<!-- Web Server -->
<web-allow v='192.168.68.0/24'/>
<!-- Folding Slots -->
<slot id='0' type='CPU'/>
</config>
準備 docker-compose.yml
以下是我的 yml 提供參考
version: '2.3'
services:
fah:
build: .
image: folding-at-home:7.6.21
container_name: fah
restart: always
cpus: 3.5
cpu_count: 4
cpuset: "0-3"
cpu_shares: 16
mem_limit: 1G
logging:
driver: "json-file"
options:
max-size: "1m"
max-file: "3"
ports:
- "7396:7396"
networks:
- fah
volumes:
- ./config:/etc/fahclient
- ./work:/work
networks:
fah:
name: fah-network
driver: bridge
Preview in new tab(opens in a new tab)
解釋幾項設定:
- cpu 相關設定:可以參考 一次搞懂 Docker CPU 資源限制 依照自己的需求給定。因為我實際跑在 Rock pi 4c 上,設定 cpuset = 0-3 跑在省電小核,最多使用 3.5 顆 CPU 時間。cpu shares 設定 16,讓他優先權較低。當 CPU 滿載時,資源可以優先提供給其他 task
- ports:folding@home web control 開在 7396
- volumes:
- config:將 config.xml 檔案放在 config 資料夾內再掛入。不直接掛檔案進去是因為在 web control 介面修改設定時,folding@home 會先將原先的 config.xml 重命名,寫入新的 config.xml 後再刪除舊的,如果只掛檔案的話會導致上述操作失敗。
- work: 是 folding 過程中的記錄檔,掛出來不怕 container 刪除後記錄遺失!
上工啦!Build image 並 start container
檔案準備完成,build image 前整個資料夾結構如下:
.
|____config
| |____config.xml
|____Dockerfile
|____docker-compose.yml
|____sample-config.xml
在根目錄中輸入以下指令 build image
$ docker-compose build
build 完後立刻啟動
$ docker-compose up -d
Folding@home 的 web control
回到瀏覽器,輸入你的 Raspberry pi IP + port 7396
http://your_raspberry_pi_ip:7396/
看到如下畫面表示 Raspberry pi 已經開始努力折疊蛋白質了!
我用 Rock pi 4c 實測,使用 3.5 顆小核,平均一個 task 大概要跑個三天。不過我將 Rock pi 4c 當作 web server 使用,每天開 24 小時,雖然跑得慢,但能夠將閒置 CPU 資源貢獻科學研究,又不會耗用太多電費,其實挺不錯的!
範例原始碼在此下載:github
延伸閱讀:
Rock 5B RK3588 終於開放預購!$79 美金起!
自己 DIY 超省電 BT 下載機吧!- 安裝 ruTorrent 到 odroid HC4
用 MotionEye + Raspberry pi 做一個網路監控系統吧!