# Purpose: the environment every script in Part 19 reads. Copy this file to rpc.env, # fill in the values for your own machines, and source it before running anything. # Nothing in this file is committed to the course: the names below are placeholders # and the real ones live only on your machines. # Platform: all # Minimum memory: 8 GB # Assumes: the names, addresses and shared storage set up in Part 18's cluster-network lab # # Usage: cp env-example.txt rpc.env && "${EDITOR:-nano}" rpc.env && . ./rpc.env # # Part 18's own .env already holds CLUSTER_IFACE, CLUSTER_PEERS, MODELS_DIR, SSH_USER and # LABBOOK. The names here are deliberately identical, so copy your values across rather than # inventing new ones; if you would rather keep one file, source Part 18's .env first and this # one after it, and delete the duplicated lines below. SSH_USER is the account you use to # reach each host to start its server; nothing in this part logs in on your behalf. # --- Every host in the cluster ------------------------------------------------------ # The interface that carries cluster traffic on THIS machine, as the operating system # names it. Part 18's lab is where you found and measured it. This is the single most # important line in the file: bind to the wrong interface and the challenge page in this # part is about you. # Linux ip -br addr e.g. enp1s0f1np1, eno1, enp5s0 # macOS networksetup -listallhardwareports e.g. en0, en5, bridge0 CLUSTER_IFACE=CHANGE-ME # Optional. Set this only when the interface has more than one address and you want a # particular one. Leave it empty and the scripts read the address off CLUSTER_IFACE. CLUSTER_ADDR= # The port each ggml-rpc-server listens on. 50052 is the tool's own default. RPC_PORT=50052 # Optional. Restrict which devices this host exposes over RPC, as ggml-rpc-server names # them: CUDA0, Vulkan0, Metal0, CPU. Empty means "expose every accelerator you find". RPC_DEVICE= # Optional. CPU threads for the CPU device on this host. Empty uses the tool's default, # which is half of the reported hardware concurrency. RPC_THREADS= # Where llama.cpp's binaries live on this machine. LLAMA_BIN=$HOME/llama.cpp/build/bin # --- The client host only ----------------------------------------------------------- # Every remote rpc-server, as host:port, comma separated, IN THE ORDER YOU WANT THE LAYERS # ASSIGNED, because that order is what --tensor-split addresses. Use the names from Part 18, # not addresses: a name you can read is a name you can debug, and it keeps addresses out of # your notes. Prefer the "-direct" name of a machine that has one, because the name you type # here decides which cable the model traffic uses. # # Leave this empty and the scripts build it from Part 18's CLUSTER_PEERS, appending RPC_PORT # to each peer in the order that variable lists them. Set it explicitly whenever the order # matters, when only some peers take part, or when a peer listens on another port. # RPC_HOSTS=node-b-direct.home.arpa:50052,node-c.home.arpa:50052 RPC_HOSTS= # Only read when RPC_HOSTS is empty. This is Part 18's variable; if you sourced Part 18's # .env first, leave it alone here. CLUSTER_PEERS= # The model. Point at the FIRST shard of a split GGUF; llama.cpp opens the rest itself. MODELS_DIR=$HOME/models MODEL=$MODELS_DIR/unsloth/Qwen3-235B-A22B-GGUF/IQ4_XS/Qwen3-235B-A22B-IQ4_XS-00001-of-00003.gguf # Proportions for --tensor-split, comma separated, in device order: the local device # first, then the RPC hosts in the order they appear in RPC_HOSTS. Leave it empty to let # llama.cpp split in proportion to each device's free memory. TENSOR_SPLIT= # Context length to allocate, and how many layers to offload. 999 means "all of them". CTX=8192 NGL=999 # Where the notebook lines go. LABBOOK=labbook.md