如何用 Raspberry pi 參與 Folding@home?

如果有使用 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 需要準備以下檔案

  1. Dockerfile
  2. sample-config.xml
  3. 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 參數

  1. fold-anon:設定你是否匿名貢獻,如果 false 的話,需要提供 user 和 passkey
  2. user / passkey / team:如第一點,可以先到 Get a Folding@home Passkey申請一組填上,這樣積分就會歸到這個 user 。同時也可以參與 team 貢獻積分,到 Team Statistics 查詢 team id 後填上即可。
  3. power:用來控制 folding@home 能吃掉多少效能。實測用 container 跑時這個設定好像沒作用,後面會分享使用 docker 原生的設定來控制效能上限
  4. slot:設定能夠使用的 CPU 或 GPU
  5. gpu: 是否可以使用 GPU
  6. 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)

解釋幾項設定:

  1. cpu 相關設定:可以參考 一次搞懂 Docker CPU 資源限制 依照自己的需求給定。因為我實際跑在 Rock pi 4c 上,設定 cpuset = 0-3 跑在省電小核,最多使用 3.5 顆 CPU 時間。cpu shares 設定 16,讓他優先權較低。當 CPU 滿載時,資源可以優先提供給其他 task
  2. ports:folding@home web control 開在 7396
  3. 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 已經開始努力折疊蛋白質了!

如何用 Raspberry pi 參與 Folding@home?

我用 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 做一個網路監控系統吧!

Written by J
雖然大學唸的是生物,但持著興趣與熱情自學,畢業後轉戰硬體工程師,與宅宅工程師們一起過著沒日沒夜的生活,做著台灣最薄的 intel 筆電,要與 macbook air 比拼。 離開後,憑著一股傻勁與朋友創業,再度轉戰軟體工程師,一手扛起前後端、雙平台 app 開發,過程中雖跌跌撞撞,卻也累計不少經驗。 可惜不是那 1% 的成功人士,於是加入其他成功人士的新創公司,專職開發後端。沒想到卻在採前人坑的過程中,拓寬了眼界,得到了深層的領悟。