Перейти к основному содержимому

Конфигурация

Майнер держит настройки в одном файле TOML. Здесь перечислены все поля, которые разбирает демон, переменные окружения, которые он читает на старте, и то, что реально делает каждое значение сети. Заканчивается страница самым практичным: какие настройки можно крутить свободно, а какие решают, пройдёт ваша работа проверку или нет.

Где лежит конфиг​

Путь по умолчанию - ~/.aetron-miner/config.toml. Демон разрешает его от $HOME, поэтому HOME обязан быть в окружении, под которым он работает. В том же каталоге лежат хранилище ключей, локальная база состояния и файл лога, если вы не увели их в другое место.

Файл пишет мастер init, и он же перезаписывается всякий раз, когда демон сохраняет настройки, поэтому правки руками живут до следующего сохранения. Старые конфиги по-прежнему читаются: ключ wallet из прежней раскладки принимается и игнорируется, а отсутствующие необязательные ключи откатываются к значениям по умолчанию, а не валят разбор.

Поля конфигурации​

ПолеТипПо умолчаниюЧто задаёт
neuronet_idцелоеобязательноИдентификатор Нейронета в цепи, в который входит майнер.
model_pathпутьобязательноПуть к весам модели, которые грузит раннер.
keystore_dirпуть~/.aetron-miner/keystore/Каталог с зашифрованным горячим ключом.
coldkey_ss58строкане заданоАдрес SS58 холодного ключа для отображения и запросов в цепь.
cache_dirпуть~/.aetron-miner/cache/Куда кэшируются модели и датасеты.
max_cache_gbцелоене заданоМягкий потолок размера кэша в гигабайтах.
resource_limit_pctцелое 0-100не заданоПотолок использования GPU. Не задано означает без лимита.
networkmainnet, testnet, localtestnetВ какую сеть AETRON целится майнер.
node_urlстрокапо сетиЭндпоинт ноды Substrate. Перебивает дефолт сети.
registry_urlстрокапо сетиКаталог моделей, через который резолвятся веса.
task_idцелое0Задача в цепи, на которую регистрируется майнер.
mesh_listenmultiaddrне заданоАдрес libp2p для приёма заданий от шлюза.
witness_validateбулевоfalseСогласие перепроверять шаги обучения других майнеров.
runner_binaryпутьне заданоПуть к подписанному релизному бинарю раннера.
fake_chainтаблицане заданоПараметры симуляции, см. ниже.

Нескольким полям строки таблицы мало.

keystore_dir содержит hotkey.json (зашифрованный) и meta.json, где лежит публичный адрес SS58, чтобы интерфейс мог показать вашу личность до разблокировки ключа. Если поля в файле нет вообще, serde откатывается на относительный путь .aetron-keystore, а не на путь от $HOME, и это стоит знать тем, кто пишет конфиг руками.

coldkey_ss58 - только адрес. Приватный ключ остаётся в вашем кошельке, и демон его не держит никогда.

cache_dir может указывать на другой том, например на второй SSD, когда веса моделей не влезают на системный диск. Тот же откат serde работает и здесь: отсутствующий ключ превращается в относительный .aetron-cache.

max_cache_gb - порог предупреждения, а не жёсткая квота. Демон предупреждает при загрузке, когда кэш вышел за него, и продолжает работать. Мастер init предлагает примерно половину свободного места на томе с cache_dir.

resource_limit_pct принимает значения от 0 до 100. Слишком низкое значение - это риск для проверки, а не настройка комфорта, потому что придушенная машина может не уложиться в тайминги задачи.

runner_binary указывает на скомпилированный релизный раннер. Когда поле задано, демон проверяет подпись бинаря против соседних файлов .digest, .sig и .pub перед запуском и отказывается стартовать при провале проверки. Молча откатываться на путь разработки он не будет. Когда поле не задано, демон запускает раннер из исходников Python в режиме разработки.

mesh_listen принимает multiaddr libp2p вроде /ip4/0.0.0.0/tcp/4101. Если оставить пустым, слушатель mesh не поднимается и единственным источником заданий остаётся цепь. Как складывается сетевой слой, описано в статье Одноранговая сеть.

witness_validate по умолчанию выключен, потому что тратит ваш GPU на чужую работу. Ответы на челленджи по вашим собственным прогонам обучения происходят всегда и этим флагом не управляются. Для проверки других майнеров нужно настоящее соединение с цепью, потому что на симулированной читать нечего.

registry_url указывает на каталог моделей, через который клиент резолвит веса. Если не задан, testnet и mainnet используют https://app.aetron.io/registry/models.json, а local не использует ничего, поэтому dev-стенду каталог кладут руками или задают явный URL здесь.

Выбор сети​

network принимает mainnet, testnet или local, по умолчанию testnet. Разбор игнорирует регистр и пробелы по краям.

Каждое значение резолвится в эндпоинт ноды по умолчанию, который перебивается полем node_url, если оно задано:

networkЭндпоинт по умолчанию
mainnetwss://entrypoint-mainnet.aetron.ai
testnetwss://entrypoint-test.aetron.ai
localws://127.0.0.1:9944

Во всех трёх случаях майнер подключается через subxt и отправляет настоящие экстринзики. Более ранние сборки для testnet и mainnet не возвращали ничего и тихо симулировали работу; этого больше нет, потому что обе сети задеплоены, а клиент, который до них не дотягивается, обязан сказать об этом, а не изображать деятельность.

Провал подключения к публичной сети тоже не уводит майнера в симуляцию. Незарегистрированный или недоступный майнер показывается офлайновым, и это честное состояние, вместо надписи «Mining» при отсутствии чего бы то ни было, что увидит цепь.

Ещё network выбирает адреса bootstrap и relay для libp2p и пространство имён Kademlia, поэтому майнеры из разных сетей не найдут друг друга по случайности.

Соединению с цепью нужен пароль горячего ключа в AETRON_WALLET_PASSWORD. Без него демон не может подписывать экстринзики и сообщает об этом в логе.

Переменные окружения​

Переменные окружения перебивают значения конфигурации там, где есть и то, и другое.

ПеременнаяЧто делает
AETRON_HOMEЗаменяет $HOME/.aetron-miner рабочим каталогом демона.
AETRON_WALLET_PASSWORDПароль горячего ключа. Нужен для соединения с цепью.
AETRON_STATE_DBПуть к базе состояния. По умолчанию ~/.aetron-miner/state.db.
AETRON_MESH_LISTENMultiaddr для mesh. Имеет приоритет над mesh_listen в конфиге.
AETRON_RUNNER_BINARYПуть к релизному раннеру. Имеет приоритет над runner_binary.
AETRON_RELEASE_PUBKEYПуть к прибитому публичному ключу для проверки релиза вместо доверия соседнему .pub.
AETRON_RUNNER_TOKENТокен, который демон передаёт раннеру для канала IPC.
AETRON_MODEL_PATHПуть к модели, передаваемый процессу раннера.
AETRON_CANONICAL_DTYPEТочность, в которой раннер грузит модель. На настоящей цепи ставится автоматически из канонической спецификации задачи, а заданное вручную не трогается.
AETRON_CHECKPOINT_ROOTКорневой каталог чекпоинтов обучения.
AETRON_WEIGHTS_REGISTRY_BASEБазовый URL для резолва весов модели.
AETRON_BOOTSTRAP_ADDRSSeed-пиры для первого входа в DHT.
AETRON_RELAY_ADDRSАдреса relay для пиров за NAT.
AETRON_PEER_CACHE_PATHФайл кэша пиров. Пустое значение использует aetron_miner_peer_cache.json в рабочем каталоге. Пустая строка или off отключают кэш.
AETRON_NETWORK_IDСуффикс имени протокола Kademlia, разделяющий пространства имён DHT.
AETRON_LANGЯзык интерфейса CLI. Откатывается к локали ОС, затем к английскому.

Кэш пиров - это дисковая копия недавно виденных пиров. Он держит до 256 пиров с восемью адресами у каждого, игнорирует записи старше семи дней и на старте набирает 8 самых свежих. Как только он заполнился, адреса bootstrap важны только для самого первого запуска узла.

С AETRON_NETWORK_ID стоит быть аккуратным: два майнера с разными значениями оказываются на разных именах протокола DHT и друг друга не найдут.

Параметры фиктивной цепи​

Таблица fake_chain настраивает симуляцию и скрыта и от мастера, и от экрана настройки. Она применяется только тогда, когда майнер не подключён к настоящей цепи. Значения по умолчанию: job_rate_per_sec = 0.5, epoch_length_blocks = 100, emission_per_block_aet = 1.5, block_time_secs = 12, pulse_cycle_secs = 600 и first_pulse_delay_secs = 60. Задержка первого Pulse обрезается до длины цикла, если задать её больше. Ни одно из этих чисел ничего не значит в настоящей сети.

Что можно менять безопасно​

Часть настроек - локальный операционный выбор. Другие кормят исполнение, которое сеть перепроверяет, и ошибка в них проявится не сообщением об ошибке, а проваленной проверкой.

Можно менять когда угодно:

  • cache_dir и max_cache_gb: закэшированные файлы можно скачать заново, а потолок только предупреждает.
  • keystore_dir, если файлы ключей переезжают вместе с ним.
  • coldkey_ss58, это метаданные для отображения и запросов.
  • AETRON_LANG, AETRON_STATE_DB и расположение лога.
  • Значения fake_chain, они никогда не касаются настоящей сети.

Менять с осторожностью:

  • resource_limit_pct. Придушив машину настолько, что она не укладывается в тайминги задачи, вы теряете награду, хотя сами результаты верны.
  • mesh_listen и переменные обнаружения пиров. Ошибка отрезает вас от доставки заданий, а несовпадающий AETRON_NETWORK_ID вообще отделяет от DHT.
  • witness_validate. Включение отдаёт ваш GPU на проверку других майнеров; это оплачиваемая работа, но она конкурирует с вашими собственными заданиями.

Прямо влияет на проверку:

  • model_path. Сеть сверяет с моделью, объявленной задачей. Указание на другие веса, другое квантование или другую ревизию даёт результат, который не сойдётся при пересчёте.
  • AETRON_CANONICAL_DTYPE. Каноническая спецификация задачи фиксирует точность. Переопределив её руками, вы получите раннер, который грузит модель не в той точности, которую ждут проверяющие, и честная работа будет помечена как расхождение. Оставьте автоматику, если только не занимаетесь отладкой.
  • neuronet_id и task_id. Они решают, против какой канонической спецификации проверяется ваша работа. Несовпадение означает, что вы работаете по настройкам одной задачи, а проверяют вас по другой.
  • runner_binary и AETRON_RELEASE_PUBKEY. Они управляют тем, какой код раннера исполняется и как проверяется его подпись. Здесь демон намеренно падает в отказ.

Общее правило простое: всё, что меняет способ загрузки модели или ход вычисления, входит в то, что сеть проверяет, и задаётся задачей, а не вашими предпочтениями. Параметры, от которых зависит пересчёт, описаны в Спецификации исполнения, а как проводится сравнение - в статье Проверка инференса.

Куда идти дальше​