Miten ohjata BOINC laskentaa sähkön pörssihinnan mukaan?

  • Keskustelun aloittaja Keskustelun aloittaja htwt
  • Aloitettu Aloitettu
  • Avainsanat Avainsanat
    boinc
Liittynyt
15.06.2017
Viestejä
34
Miten saan BOINC -ohjelman lopettamaan laskennan kun tietty sähkön pörssihinta ylitetään?

BOINC on siis tällainen tieteen hyväksi hajautettua laskentaa tekevä ohjelma:
 
Joku skripti? Lisään vielä, että en ole koskaan kirjottanut skriptiä. Kapea kokemus C ohjelmoinnista ja sekin sulaututeista. (ilman OS)
 
Vieläkö Boincissa on jotain laskemisen arvoista? Sehän meni vähän huonoksi koko homma, kun World Community Grid siirtyi IBM:ltä Krembilille.

Sinänsä ketjun aihe kiinnostaisi, jos jotain järkevää työtä vielä löytyisi.
 
Olet osin oikeassa, mutta kyllä sieltä löytyy monenlaista yleishyödyllistä tutkimusprojektia. Itse olen halunnut antaa laskentakapasiteettia biologian alalle. Esimerkiksi proteiinien laskostuminen on edelleen tärkeää, vaikka Googlen tekoäly "löysi ne kaikki". Myös RNA tutkimus on nyt aika kuuma aihe.


Kaikki projektit:

Sydän- ja verisuonitautien tutkimus:

Näytönohjaimella laskettavia projekteja, esim. syöpätutkimus:

RNA tutkimusta: (+projektin kuvaus)

Rosetta@home on saanut paljon osallistujia: (+projektin kuvaus)

Mainitsemasi World Community Grid löytyy myös:

Oma osallistuminen loppui joskus 2007, mutta nyt olisi taas tehokas kone...

United Devices - Cancer Research Project.jpg


Edit: Homma ei vaadi välttämättä tehokasta tietokonetta. Moni projekti tukee eri alustoja kuten ARM ja Android. Laskentatehoa voi lahjoittaa vaikka ylimääräiseksi jääneellä kännykällä tai Raspilla.
Tietokoneeseen asennettuna se käyttää vain prosessorin tyhjäkäyntiajan eikä vaikuta normaalii koneen käyttöön.
 
Viimeksi muokattu:
Rosettaan ja WCG:iin olen osallistunut, mutta World Community Gridiltä on projektit loppuneet omistajanvaihdoksen myötä, ja sieltä lähteneet laskijat ovat täyttäneet muut projektit, joten laskettavaa on aika vähän tarjolla. Avaruusprojektien tilasta en tiedä, mutta ne eivät ole järin lähellä sydäntä.
 
Tein pythonilla skriptin joka käynnistää ja sulkee halutun prosessin pörssisähkön hinnan mukaan. En testannut juuri boinc ohjelmaa mutta tämän luulisi saavan toimimaan sen kanssa
  1. Varmista että python on ajettavissa komentorivilä. Windowsilla se pitää asentaa. Skripti testattu versiolla 3.10
  2. Tallenna oheinen koodi tiedostoon, esim. porssisahko.py
  3. Muokkaa skriptissä prosessin käynnistys argumentit (process_args) ja hinnan raja-arvo (price_threshold) haluttuun arvoon
  4. Avaa samassa kansiossa komentorivi ja aja python porssisahko.py
  5. Ctrl+C pysäyttää ohjelman
Python:
# Mikä prosessi käynnistetään. Muokkaa tähän haluamasi
process_args = ["boinc.exe"]
# Prosessi pysäytetään jos pörssisähkön hinta ylittää raja-arvon
price_threshold = 5  # snt/kWh

import subprocess
import time
from datetime import datetime, timedelta, timezone

# Jos tästä tulee virhe, aja komentorivillä 'pip install requests'
import requests


def get_latest_prices():
    try:
        response = requests.get("https://api.porssisahko.net/v1/latest-prices.json", timeout=60)
        response.raise_for_status()
        prices = response.json()["prices"]
        for p in prices:
            p["startDate"] = datetime.fromisoformat(p["startDate"].replace("Z", "+00:00"))
            p["endDate"] = datetime.fromisoformat(p["endDate"].replace("Z", "+00:00"))
        return prices
    except requests.RequestException as e:
        print(f"{e}: {e.response.text if e.response else None}")

def get_price(prices: list, at: datetime):
    if not prices:
        return None
    return next((p["price"] for p in prices if p["startDate"] <= at < p["endDate"]), None)

def main():
    print(f"Ajetaan {process_args} kun pörssisähkön hinta alittaa {price_threshold} snt/kWh")
    prices = []
    proc: subprocess.Popen = None
    while True:
        utcnow = datetime.now(timezone.utc)
        # Nord Pool julkaisee seuraavan päivän tiedot klo 14 eli 10 tuntia ennen edellisten tietojen loppua.
        if not prices or (prices[0]["endDate"] - utcnow) < timedelta(hours=9):
            print(f"{utcnow.astimezone()} Haetaan pörssisähkön hinnat")
            prices = get_latest_prices()
            if prices:
                print(f"{utcnow.astimezone()} Hinnat haettu {prices[0]['endDate'].astimezone()} asti")
        price_now = get_price(prices, utcnow)
        if price_now and price_now <= price_threshold:
            if not proc:
                print(f"{utcnow.astimezone()} Ajetaan {process_args} koska pörssisähkö on {price_now} snt/kWh")
                proc = subprocess.Popen(process_args)
        else:
            if proc:
                print(f"{utcnow.astimezone()} Pysäytetään {proc.args} koska pörssisähkö on {price_now} snt/kWh")
                proc.terminate()
                try:
                    exitcode = proc.wait(60)
                except TimeoutError:
                    proc.kill()
                    exitcode = proc.wait(10)
                proc = None
                print(f"Exited with {exitcode}")
        time.sleep(60)

if __name__ == "__main__":
    main()

Edit: Parannettu REST api kutsun virheenhallintaa
 
Viimeksi muokattu:
Siitä on jo aikaa kun BOINCia ajelin, joskus koronaepidemian aikana varmaan viimeksi. Ainakin linuxilla boincin sai palveluksi jota pystyi käynnistelemään ja sammuttelemaan ihan jotenkin tyyliin
Koodi:
systemctl start boinc

systemctl stop boinc
Jos tuon BOINCin tappaa ihan kylmästi niin menossa oleva laskenta katoaa bittiavaruuteen joten tuo pitää saada sammumaan jotenkin niin että BOINC kerkiää pysäyttämään laskennan ja tallentamaan tilanteen, muuten saattaa mennä paljon laskentaa ihan harakoille. En tiedä kuinka tuo BOINC reagoi tuohon proc.terminateen, saattaa ajaa itsensä kiltisti alas tai sitten tappaa sen niin että laskenta menee vituiksi. Tuo on syytä kokeilla.

Itselläni tuo oli ohjattuna niin että yön ajaksi pistettiin laskenta sammuksiin ettei tuulettimet häirinneet yöunia, ajelin siis makkarin nurkassa olevalla pikku serverillä tuota aikanaan ja välillä tuulettimet intoutuivat oikein kunnolla puhkumaan niin häiritsivät vähän nukkumista.
 

Uusimmat viestit

Statistiikka

Viestiketjuista
281 589
Viestejä
4 841 282
Jäsenet
78 251
Uusin jäsen
bef

Hinta.fi

Back
Ylös Bottom