- You must need to buy a VPS for running Allora Worker
- You can buy from : Contabo
- You should buy VPS which is fulfilling all these requirements :
Operating System : Ubuntu 22.04
CPU: Minimum of 1/2 core.
Memory: 2 to 4 GB.
Storage: SSD or NVMe with at least 5GB of space.
rm -rf allora-model.sh allora-chain/ basic-coin-prediction-node/
apt install wget
wget https://raw.githubusercontent.com/0xtnpxsgt/Allora-Worker-Chronos-Model/main/allora-model.sh && chmod +x allora-model.sh && ./allora-model.sh
-
In the middle of the command execution, it will ask for keyring phrase, Here you need write a password (example : 12345678)
-
During pasting
HEAD_ID
, Don't useCtrl+C
to copy andCtrl+V
to paste, instead just select the wholeKEY_ID
and Press Right Click -
Once Done Proceed to Step 4
- Export Head-ID
cd allora-chain/basic-coin-prediction-node/
cat head-data/keys/identity
- Register on Coingecko https://www.coingecko.com/en/developers/dashboard & Create Demo API KEY
- Copy & Replace API with your
COINGECKO API
, then saveCtrl+X Y ENTER
.
sudo rm -rf app.py && sudo nano app.py
from flask import Flask, Response
import requests
import json
import pandas as pd
import torch
from chronos import ChronosPipeline
# create our Flask app
app = Flask(__name__)
# define the Hugging Face model we will use
model_name = "amazon/chronos-t5-tiny"
# define our endpoint
@app.route("/inference/<string:token>")
def get_inference(token):
"""Generate inference for given token."""
if not token or token != "ETH":
error_msg = "Token is required" if not token else "Token not supported"
return Response(json.dumps({"error": error_msg}), status=400, mimetype='application/json')
try:
# use a pipeline as a high-level helper
pipeline = ChronosPipeline.from_pretrained(
model_name,
device_map="auto",
torch_dtype=torch.bfloat16,
)
except Exception as e:
return Response(json.dumps({"pipeline error": str(e)}), status=500, mimetype='application/json')
# get the data from Coingecko
# here we'll use last 30 days of ETH/USD
url = "https://api.coingecko.com/api/v3/coins/ethereum/market_chart?vs_currency=usd&days=30&interval=daily"
headers = {
"accept": "application/json",
"x-cg-demo-api-key": "CG-XXXXXXXXXXXXXXXXXXX" # replace with your API key
}
response = requests.get(url, headers=headers)
if response.status_code == 200:
data = response.json()
df = pd.DataFrame(data["prices"])
df.columns = ["date", "price"]
df["date"] = pd.to_datetime(df["date"], unit = "ms")
df = df[:-1] # removing today's price
print(df.tail(5))
else:
return Response(json.dumps({"Failed to retrieve data from the API": str(response.text)}),
status=response.status_code,
mimetype='application/json')
# define the context and the prediction length
context = torch.tensor(df["price"])
prediction_length = 1
try:
forecast = pipeline.predict(context, prediction_length) # shape [num_series, num_samples, prediction_length]
print(forecast[0].mean().item()) # taking the mean of the forecasted prediction
return Response(str(forecast[0].mean().item()), status=200)
except Exception as e:
return Response(json.dumps({"error": str(e)}), status=500, mimetype='application/json')
# run our Flask app
if __name__ == '__main__':
app.run(host="0.0.0.0", port=8000, debug=True)
- Copy & Paste this code: , then save
Ctrl+X Y ENTER
.
sudo rm -rf main.py && sudo nano main.py
import requests
import sys
import json
def process(argument):
headers = {'Content-Type': 'application/json'}
url = f"http://inference:8000/inference/{argument}"
response = requests.get(url, headers=headers)
return response.text
if __name__ == "__main__":
# Your code logic with the parsed argument goes here
try:
if len(sys.argv) < 5:
value = json.dumps({"error": f"Not enough arguments provided: {len(sys.argv)}, expected 4 arguments: topic_id, blockHeight, blockHeightEval, default_arg"})
else:
topic_id = sys.argv[1]
blockHeight = sys.argv[2]
blockHeightEval = sys.argv[3]
default_arg = sys.argv[4]
response_inference = process(argument=default_arg)
response_dict = {"infererValue": response_inference}
value = json.dumps(response_dict)
except Exception as e:
value = json.dumps({"error": {str(e)}})
print(value)
- Copy & Paste this code: , then save
Ctrl+X Y ENTER
.
sudo rm -rf requirements.txt && sudo nano requirements.txt
flask[async]
gunicorn[gthread]
numpy==1.26.2
pandas
Requests==2.32.0
transformers[torch]
scikit_learn==1.3.2
werkzeug>=3.0.3 # not directly required, pinned by Snyk to avoid a vulnerability
git+https://github.com/amazon-science/chronos-forecasting.git
python-dotenv
- Copy & Paste this code ,
Ctrl+X Y ENTER
to save.
sudo rm -rf Dockerfile && sudo nano Dockerfile
# Use an official Python runtime AS the base image
FROM amd64/python:3.9-buster as project_env
# Set the working directory in the container
WORKDIR /app
# Install dependencies
COPY requirements.txt requirements.txt
RUN pip install --upgrade pip setuptools \
&& pip install -r requirements.txt
FROM project_env
COPY . /app/
# Set the entrypoint command
CMD ["gunicorn", "--conf", "/app/gunicorn_conf.py", "main:app"]
- Copy & Replace
HEAD-ID
WALLETSEEDPHRASE
Worker1 - Worker2
rm -rf docker-compose.yml && nano docker-compose.yml
version: '3'
services:
inference:
container_name: inference
build:
context: .
command: python -u /app/app.py
ports:
- "8000:8000"
networks:
eth-model-local:
aliases:
- inference
ipv4_address: 172.22.0.4
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8000/inference/ETH"]
interval: 10s
timeout: 10s
retries: 12
volumes:
- ./inference-data:/app/data
updater:
container_name: updater
build: .
environment:
- INFERENCE_API_ADDRESS=http://inference:8000
command: >
sh -c "
while true; do
python -u /app/update_app.py;
sleep 24h;
done
"
depends_on:
inference:
condition: service_healthy
networks:
eth-model-local:
aliases:
- updater
ipv4_address: 172.22.0.5
head:
container_name: head
image: alloranetwork/allora-inference-base-head:latest
environment:
- HOME=/data
entrypoint:
- "/bin/bash"
- "-c"
- |
if [ ! -f /data/keys/priv.bin ]; then
echo "Generating new private keys..."
mkdir -p /data/keys
cd /data/keys
allora-keys
fi
allora-node --role=head --peer-db=/data/peerdb --function-db=/data/function-db \
--runtime-path=/app/runtime --runtime-cli=bls-runtime --workspace=/data/workspace \
--private-key=/data/keys/priv.bin --log-level=debug --port=9010 --rest-api=:6000 \
--boot-nodes=/dns/head-0-p2p.testnet-1.testnet.allora.network/tcp/32130/p2p/12D3KooWLBhsSucVVcyVCaM9pvK8E7tWBM9L19s7XQHqqejyqgEC,/dns/head-1-p2p.testnet-1.testnet.allora.network/tcp/32131/p2p/12D3KooWEUNWg7YHeeCtH88ju63RBfY5hbdv9hpv84ffEZpbJszt,/dns/head-2-p2p.testnet-1.testnet.allora.network/tcp/32132/p2p/12D3KooWATfUSo95wtZseHbogpckuFeSvpL4yks6XtvrjVHcCCXk
ports:
- "6000:6000"
volumes:
- ./head-data:/data
working_dir: /data
networks:
eth-model-local:
aliases:
- head
ipv4_address: 172.22.0.100
worker-1:
container_name: worker-1
environment:
- INFERENCE_API_ADDRESS=http://inference:8000
- HOME=/data
build:
context: .
dockerfile: Dockerfile_b7s
entrypoint:
- "/bin/bash"
- "-c"
- |
if [ ! -f /data/keys/priv.bin ]; then
echo "Generating new private keys..."
mkdir -p /data/keys
cd /data/keys
allora-keys
fi
# Change boot-nodes below to the key advertised by your head
allora-node --role=worker --peer-db=/data/peerdb --function-db=/data/function-db \
--runtime-path=/app/runtime --runtime-cli=bls-runtime --workspace=/data/workspace \
--private-key=/data/keys/priv.bin --log-level=debug --port=9011 \
--boot-nodes=/ip4/172.22.0.100/tcp/9010/p2p/HEAD-ID \
--topic=allora-topic-1-worker --allora-chain-worker-mode=worker \
--allora-chain-restore-mnemonic='WALLETSEEDPHRASE' \
--allora-node-rpc-address=https://allora-rpc.testnet-1.testnet.allora.network \
--allora-chain-key-name=worker-1 \
--allora-chain-topic-id=1
volumes:
- ./workers/worker-1:/data
working_dir: /data
depends_on:
- inference
- head
networks:
eth-model-local:
aliases:
- worker1
ipv4_address: 172.22.0.12
worker-2:
container_name: worker-2
environment:
- INFERENCE_API_ADDRESS=http://inference:8000
- HOME=/data
build:
context: .
dockerfile: Dockerfile_b7s
entrypoint:
- "/bin/bash"
- "-c"
- |
if [ ! -f /data/keys/priv.bin ]; then
echo "Generating new private keys..."
mkdir -p /data/keys
cd /data/keys
allora-keys
fi
# Change boot-nodes below to the key advertised by your head
allora-node --role=worker --peer-db=/data/peerdb --function-db=/data/function-db \
--runtime-path=/app/runtime --runtime-cli=bls-runtime --workspace=/data/workspace \
--private-key=/data/keys/priv.bin --log-level=debug --port=9013 \
--boot-nodes=/ip4/172.22.0.100/tcp/9010/p2p/HEAD-ID \
--topic=allora-topic-2-worker --allora-chain-worker-mode=worker \
--allora-chain-restore-mnemonic='WALLETSEEDPHRASE' \
--allora-node-rpc-address=https://allora-rpc.testnet-1.testnet.allora.network \
--allora-chain-key-name=worker-2 \
--allora-chain-topic-id=2
volumes:
- ./workers/worker-2:/data
working_dir: /data
depends_on:
- inference
- head
networks:
eth-model-local:
aliases:
- worker1
ipv4_address: 172.22.0.13
networks:
eth-model-local:
driver: bridge
ipam:
config:
- subnet: 172.22.0.0/24
volumes:
inference-data:
workers:
head-data:
docker compose build && docker compose up -d
docker ps
# Check worker 2 logs
docker compose logs -f worker-2
# Check worker 1 logs
docker compose logs -f worker-1
# Check worker infernence - result 200 means- success.
docker compose logs -f inference
# Download Checker
wget -O checkyourworker.sh https://raw.githubusercontent.com/casual1st/alloraworkersetup/main/checkyourworker.sh
chmod +x checkyourworker.sh
./checkyourworker.sh
./checkyourworker.sh
HAVING PROBLEM WITH THE SETUP? JOIN US HERE: https://discord.gg/r6PPSjRZec | help is on the way! :D
- Rerefence
- Rejump https://github.com/ReJumpLabs/Hugging-Face-model