A Synergy plugin for SII 启智平台 (qz.sii.edu.cn) — an academic GPU/HPC cluster for AI research.
holos-inspire gives the Synergy agent direct control over:
- GPU training job submission
- HPC / Slurm task submission
- Docker image management and Harbor push
- resource discovery and availability inspection
- job logs and GPU metrics
- notebook environments
- inference deployment
- platform model repository management
This is the complete usage manual.
| Tool | Purpose |
|---|---|
inspire_config |
Read/write plugin defaults such as project, workspace, image, priority, shm, and command prefix |
inspire_login |
Save and validate Inspire platform credentials or Harbor registry credentials |
inspire_status |
Discover projects, workspaces, compute groups, available specs, quota context, and storage paths |
inspire_submit |
Submit GPU training jobs |
inspire_submit_hpc |
Submit HPC / CPU jobs using Slurm-style scheduling |
inspire_inference |
Create, inspect, and stop inference services |
inspire_jobs |
List tasks by type and normalized status |
inspire_job_detail |
Read detailed task configuration and failure diagnostics |
inspire_logs |
Query or download task logs |
inspire_metrics |
Inspect GPU / system metrics with health assessment |
inspire_stop |
Stop a single task or batch-stop matching tasks |
inspire_images |
Browse platform-registered images or raw Harbor images |
inspire_image_push |
Push a local Docker image to Harbor and return the platform-usable display address |
inspire_notebook |
Create, list, inspect, start, and stop notebooks |
inspire_models |
List, inspect, create, and delete model-repository entries |
The plugin also ships a built-in skill:
sii-inspire
It covers:
- first-time setup
- end-to-end job workflows
- platform rules and caveats
- troubleshooting
- distributed training notes
Add the plugin to your Synergy config:
Synergy installs plugins automatically on startup.
The plugin has two independent authentication targets.
This is your 启智平台 account:
- 学工号
- password
You need it for:
- resource discovery
- job submission
- job inspection
- logs / metrics / notebooks / inference / models
This is not the same as your platform account. You get it from:
- 启智平台 → 镜像管理 → 本地推送
You need it for:
- pushing local Docker images to Harbor
There are two Harbor registries:
qb— 七宝 (default, used by all spaces except SJ)sj— 松江 (used only by SJ spaces)
synergy inspire login --username <学工号> --password <密码>
synergy inspire harbor-login --username <harbor-user> --password <harbor-password>
synergy inspire harbor-login --username <harbor-user> --password <harbor-password> --registry sjinspire_login(target="inspire", username="...", password="...")
inspire_login(target="harbor", username="...", password="...", registry="qb")
inspire_login(target="harbor", username="...", password="...", registry="sj")
Credential validation is best effort:
- if validation succeeds, you are ready to use the platform immediately
- if validation fails because you are off-campus / off-VPN, credentials are still saved
- once the network is restored, the saved credentials will work automatically
So a failed validation does not necessarily mean the credentials are wrong.
The recommended first-time setup flow is:
inspire_login(target="inspire", username="...", password="...")
If you plan to push images:
inspire_login(target="harbor", username="...", password="...", registry="qb")
inspire_status()
This is the entry tool for the whole platform. Use it before submitting anything.
It tells you:
- which projects you belong to
- which workspaces exist in those projects
- whether a workspace has internet access
- which compute groups exist
- which specs are available for each schedule type
- project budget / priority context
- shared storage path
If you repeatedly use the same project / workspace / image, set defaults:
inspire_config(action="set", key="defaultProject", value="你的项目名")
inspire_config(action="set", key="defaultWorkspace", value="分布式训练空间")
inspire_config(action="set", key="defaultImage", value="docker.sii.shaipower.online/inspire-studio/your-image:tag")
inspire_config(action="set", key="defaultPriority", value="9")
inspire_config(action="set", key="defaultShm", value="65536")
inspire_config(action="set", key="commandPrefix", value="source /opt/conda/etc/profile.d/conda.sh && conda activate myenv && cd /inspire/hdd/project/{en_name}/code")
Then inspect current defaults with:
inspire_config(action="get")
The platform runs commands in a non-interactive shell. That means:
~/.bashrcis not loaded- your conda environment is not activated automatically
- your working directory is not changed automatically
So in practice you almost always want:
source /opt/conda/etc/profile.d/conda.sh && conda activate myenv && cd /inspire/hdd/project/{en_name}/codePutting that into commandPrefix saves a lot of repeated boilerplate.
These are not stored as defaults:
speccompute_group
Because they vary by:
- workspace
- task type
- cluster
Discover them from inspire_status; if you pass a missing or invalid spec, the submit tools will surface available options for the target space and compute group.
This is one of the most important platform rules.
- push domain:
docker-qb.sii.edu.cn - display domain:
docker.sii.shaipower.online - used by: all non-SJ spaces
- push domain:
docker-t.sii.edu.cn - display domain:
docker-t.sii.shaipower.online - used by: SJ spaces only
After pushing, submit jobs using the display domain, not the push domain.
Good:
docker.sii.shaipower.online/inspire-studio/my-image:v1
Bad:
docker-qb.sii.edu.cn/inspire-studio/my-image:v1
The plugin already knows this and returns the correct display-domain address from inspire_image_push.
After pushing an image to Harbor, you must register it on the platform:
- 启智平台 → 镜像管理 → 新建镜像
- fill:
- 镜像名称
- 版本号
Without registration:
inspire_submitcannot use the imageinspire_notebookcannot use the image
inspire_image_push tells you exactly what values to fill in.
Different workspaces have different network permissions.
These can access whitelisted external network resources:
- 可上网GPU资源
- CPU资源空间
- 国产卡
- PPU
- 专属资源开发空间
- SJ资源空间
These have no internet:
- 分布式训练空间
- 高性能计算
- 整节点任务空间
In offline spaces, your command must not rely on network access. Do not do this inside job commands:
pip installgit clonewgetcurl- online model download
All dependencies must already be in:
- the Docker image, or
- the shared project storage path
The project storage path is shared across spaces in the same project:
/inspire/hdd/project/{en_name}/
This is important because it enables a common workflow:
- download data or models in an online space
- train in an offline space using the same shared path
There is also a personal global directory:
/inspire/hdd/global_user/{username}/
Be careful: deletion on the cluster is effectively irreversible.
- priority
>= 4: task will not be preempted - priority
1-3: task may be killed by higher-priority tasks
- advisor projects refresh quarterly
- public research projects refresh weekly
- low-priority CPU tasks (
1-3) do not consume project budget
That means low-priority CPU jobs are a useful fallback when your budget is exhausted.
For multi-GPU training, shared memory is critical.
Recommended rules:
- single-GPU: default is often enough
- multi-GPU / multi-node: use at least
65536MB (64 GB)
A too-small shm often causes distributed training failures.
The platform auto-injects:
MASTER_ADDRMASTER_PORTPET_NNODESPET_NODE_RANKPET_NPROC_PER_NODE
Use them directly in torchrun / deepspeed commands.
inspire_status()
inspire_submit(name="exp-001", command="python train.py", compute_group="...", spec="...")
inspire_jobs(status="running")
inspire_logs(job_id="job-xxx", lines=50)
inspire_metrics(job_id="job-xxx", time_range="30m")
Required in practice:
namecommandcompute_groupspec
Everything else can come from defaults if configured.
Always capture output to a file:
python train.py 2>&1 | tee /inspire/hdd/project/{en_name}/logs/exp-001.logIf spec is missing or invalid, the tool helps you recover by surfacing available specs for the target space / compute group.
Use inspire_submit_hpc for:
- preprocessing
- evaluation
- CPU-heavy scripts
- Slurm-based workflows
Example shape:
inspire_submit_hpc(
name="preprocess",
entrypoint="python preprocess.py",
workspace="高性能计算",
compute_group="高性能计算",
spec="...",
image="docker.sii.shaipower.online/inspire-studio/slurm-xxx:tag",
number_of_tasks=2,
cpus_per_task=4,
memory_per_cpu="8G"
)
Important:
- HPC spaces are offline
- your image must be Slurm-compatible
inspire_jobs(status="running")
inspire_jobs(status="failed")
inspire_jobs(type="hpc", status="all")
Status families are normalized into:
runningwaitingsucceededfailedstoppedall
inspire_job_detail(job_id="job-xxx")
Task ID prefix determines task type automatically:
job-xxx→ GPU traininghpc-job-xxx→ HPC tasksv-xxx→ inference serving
inspire_logs(job_id="job-xxx", lines=100)
inspire_logs(job_id="job-xxx", download=true)
inspire_metrics(job_id="job-xxx", time_range="30m")
inspire_metrics(job_id="job-xxx", mode="raw", time_range="1h")
inspire_metrics(job_id="job-xxx", mode="download", time_range="3h")
inspire_metrics answers the practical question—is the job actually training, or sitting idle?—with:
- summary stats
- health hints
- stability checks
- idle-window detection
inspire_stop(job_id="job-xxx")
inspire_stop(job_id="sv-xxx")
The tool can also batch-stop matching tasks by workspace and status filter when you need to clear a queue or stop a whole class of runs.
Platform-registered images:
inspire_images(search="torch")
Raw Harbor images:
inspire_images(source="harbor", search="torch")
inspire_images(source="harbor", repo="my-image")
inspire_image_push(image="my-train:v1")
Optional parameters:
nametagregistry(qborsj)description
Because it:
- handles Harbor auth more cleanly
- normalizes the target path
- returns the correct display-domain image address
- tells you the exact 镜像名称 / 版本号 needed for platform registration
Before using it, make sure:
- Docker is installed and running locally
- the machine can reach Harbor (campus network or VPN)
- Harbor credentials have been saved
Use inspire_notebook for interactive environments.
inspire_notebook(action="create", name="dev-env", compute_group="...", spec="...", image="...")
inspire_notebook(action="list")
inspire_notebook(action="detail", notebook_id="...")
inspire_notebook(action="start", notebook_id="...")
inspire_notebook(action="stop", notebook_id="...")
Notebook specs are different from training specs.
Always get notebook specs from inspire_status rather than reusing a training spec ID.
inspire_models(action="list")
inspire_inference(
action="create",
name="llama-serving",
model_id="...",
model_version=1,
image="docker.sii.shaipower.online/inspire-studio/vllm:tag",
command="python -m vllm.entrypoints.openai.api_server",
port=2400,
replicas=1,
compute_group="...",
spec="..."
)
Then inspect or stop it:
inspire_inference(action="detail", serving_id="sv-xxx")
inspire_inference(action="stop", serving_id="sv-xxx")
inspire_models(action="list")
inspire_models(action="detail", model_id="...")
inspire_models(action="create", name="...", model_source_path="...")
inspire_models(action="delete", model_id="...")
This is mainly useful for inference deployment, because inspire_inference needs model_id and model_version.
inspire_login(target="inspire", ...)inspire_status()inspire_config(action="set", ...)for defaultsinspire_submit(...)inspire_jobs(status="running")inspire_metrics(...)inspire_logs(...)inspire_job_detail(...)if failure occurs
- use an internet-enabled workspace to download models / datasets into
/inspire/hdd/project/{en_name}/... - wait until download completes
- submit the real training in an offline workspace
- point the training job at the shared storage path
- build a local Docker image
- login to Harbor
- use
inspire_image_push - manually register the image on the platform
- use the returned display-domain address in
inspire_submitorinspire_notebook
Wrong:
docker-qb.sii.edu.cn/inspire-studio/...
Right:
docker.sii.shaipower.online/inspire-studio/...
A successful Harbor push does not mean the image is usable by jobs. You must register it in 镜像管理.
Do not use:
pip installgit clonewgetcurl
in offline spaces.
The platform shell is non-interactive.
If you do not set commandPrefix, your command must initialize the environment manually.
Training, HPC, and notebook specs are different. Do not assume a quota ID from one task type works for another.
For multi-GPU jobs, 65536 MB is the safe baseline.
They are separate. A successful Inspire login does not mean Harbor push will work.
Possibilities:
- your account lacks API access
- you are off-campus / off-VPN
- the platform endpoint changed or is partially down
Start with:
inspire_status()inspire_job_detail(...)inspire_logs(...)
Common causes:
- wrong
spec - wrong
compute_group - image not registered on the platform
- image domain is the push domain instead of display domain
- priority exceeds project max
- project budget exhausted
Check:
inspire_metrics(...)for low utilization / idle windowsinspire_logs(...)for environment setup failures- whether
commandPrefixor manual conda init is missing
Check:
- Harbor credentials are correct for the right registry (
qbvssj) - Docker is running locally
- network can reach Harbor
- the target registry matches the target workspace family
Notebook uses SCHEDULE_CONFIG_TYPE_DSW, not training specs.
Discover notebook specs explicitly.
If you need to inspect implementation details, these files matter most:
src/index.ts— plugin entry, tool registration, CLI registrationsrc/auth.ts— Inspire and Harbor authentication behaviorsrc/api.ts— platform API layersrc/resolve.ts— name/ID resolutionsrc/cache.ts— cache layersrc/shared.ts— shared validation and helper flowssrc/tools/status.ts— entry-point discovery toolsrc/tools/submit.ts— GPU training submissionsrc/tools/submit-hpc.ts— HPC submissionsrc/tools/metrics.ts— metrics and health assessmentsrc/tools/image-push.ts— image push flowskills/sii-inspire/content.txt— built-in skill guidance
bun install
bun run typecheckRelease is handled through the GitHub Release workflow.
MIT