Provision Netron and Lab 1 local assets

This commit is contained in:
c4ch3c4d3
2026-04-16 11:15:39 -06:00
parent 56305680e0
commit 59f3032f91
16 changed files with 248 additions and 216 deletions
+14 -29
View File
@@ -9,15 +9,15 @@ courseware_datasets_dir: "{{ courseware_state_dir }}/datasets"
courseware_tools_dir: "{{ courseware_state_dir }}/tools"
courseware_apps_dir: "{{ courseware_state_dir }}/apps"
courseware_downloads_dir: "{{ courseware_state_dir }}/downloads"
courseware_lab1_dir: "{{ courseware_state_dir }}/lab1"
courseware_lab2_dir: "{{ courseware_state_dir }}/lab2"
courseware_lab6_dir: "{{ courseware_state_dir }}/lab6"
courseware_transformerlab_legacy_home: "{{ courseware_state_dir }}/transformerlab-home"
courseware_safe_homes_dir: "{{ lookup('env', 'HOME') }}/.local/share/local-lab-deployment"
courseware_transformerlab_home: "{{ (courseware_safe_homes_dir ~ '/transformerlab-home') if ' ' in courseware_root else courseware_transformerlab_legacy_home }}"
courseware_unsloth_home: "{{ courseware_state_dir }}/unsloth-home"
courseware_lab1_models_dir: "{{ courseware_models_dir }}/lab1"
courseware_ollama_models_dir: "{{ courseware_models_dir }}/ollama"
courseware_node_runtime_dir: "{{ courseware_tools_dir }}/node-runtime"
courseware_node_runtime_bin_dir: "{{ courseware_node_runtime_dir }}/node_modules/node/bin"
courseware_netron_venv_dir: "{{ courseware_venvs_dir }}/netron"
courseware_wetty_dir: "{{ courseware_tools_dir }}/wetty"
courseware_promptfoo_dir: "{{ courseware_lab6_dir }}"
courseware_wiki_repo_dir: "{{ courseware_repos_dir }}/LLM-Labs"
@@ -29,7 +29,7 @@ courseware_url_host: "127.0.0.1"
courseware_ports:
ollama: 11434
open_webui: 8080
transformerlab: 8338
netron: 8338
chunkviz: 3001
embedding_atlas: 5055
unsloth: 8888
@@ -37,30 +37,8 @@ courseware_ports:
wiki: 80
wetty: 7681
courseware_transformerlab_install_mode: "single-user-pinned"
courseware_transformerlab_version: "v0.28.2"
courseware_transformerlab_version_dir: "{{ courseware_transformerlab_version | regex_replace('^v', '') }}"
courseware_transformerlab_source_archive: "{{ courseware_downloads_dir }}/transformerlab-app-{{ courseware_transformerlab_version_dir }}.tar.gz"
courseware_transformerlab_web_archive: "{{ courseware_downloads_dir }}/transformerlab-web-{{ courseware_transformerlab_version_dir }}.tar.gz"
courseware_transformerlab_miniforge_installer: "{{ courseware_downloads_dir }}/transformerlab-miniforge-installer.sh"
courseware_transformerlab_default_user_email: "student@zuccaro.me"
courseware_transformerlab_default_user_password: "student"
courseware_transformerlab_default_user_first_name: "Student"
courseware_transformerlab_default_user_last_name: ""
courseware_transformerlab_required_loader_plugins:
- "fastchat_server"
courseware_transformerlab_required_supports_fastchat:
- "chat"
- "completion"
- "visualize_model"
- "model_layers"
- "rag"
- "tools"
- "template"
- "embeddings"
- "tokenize"
- "logprobs"
- "batched"
courseware_netron_version: "9.0.1"
courseware_ollama_min_version: "0.12.11"
courseware_llama_cpp_commit: "51fa458a92d6a3f305f8fd76fc8f702e3e87ddb5"
courseware_chunkviz_commit: "a891eacafda1f28a12373ad3b00102e68f07c57f"
courseware_promptfoo_version: "0.119.0"
@@ -72,6 +50,13 @@ courseware_wiki_repo: "https://git.zuccaro.me/bzuccaro/LLM-Labs.git"
courseware_open_webui_spec: "open-webui"
courseware_embedding_atlas_spec: "embedding-atlas"
courseware_lab1_qwen_filename: "Qwen3-0.6B-Q8_0.gguf"
courseware_lab1_qwen_download_url: "https://huggingface.co/Qwen/Qwen3-0.6B-GGUF/resolve/main/Qwen3-0.6B-Q8_0.gguf?download=true"
courseware_lab1_qwen_local_path: "{{ courseware_lab1_models_dir }}/{{ courseware_lab1_qwen_filename }}"
courseware_lab1_qwen_model_alias: "lab1-qwen3-0.6b-q8_0"
courseware_lab1_llama_filename: "Llama-3.2-1B.Q4_K_M.gguf"
courseware_lab1_llama_download_url: "https://huggingface.co/DevQuasar-3/meta-llama.Llama-3.2-1B-GGUF/resolve/main/Llama-3.2-1B.Q4_K_M.gguf?download=true"
courseware_lab1_llama_local_path: "{{ courseware_lab1_models_dir }}/{{ courseware_lab1_llama_filename }}"
courseware_white_rabbit_repo: "bartowski/WhiteRabbitNeo_WhiteRabbitNeo-V3-7B-GGUF"
courseware_white_rabbit_variants:
@@ -150,7 +135,7 @@ courseware_ollama_install_marker: "{{ courseware_markers_dir }}/ollama-installed
courseware_services:
- "ollama"
- "open-webui"
- "transformerlab"
- "netron"
- "chunkviz"
- "embedding-atlas"
- "unsloth"
-49
View File
@@ -12,17 +12,6 @@
changed_when: false
failed_when: false
- name: Stat managed TransformerLab symlink
stat:
path: "{{ ansible_env.HOME }}/.transformerlab"
follow: false
register: courseware_down_transformerlab
- name: Stat managed TransformerLab marker
stat:
path: "{{ ansible_env.HOME }}/.transformerlab/.courseware-managed"
register: courseware_down_transformerlab_marker
- name: Stat managed Unsloth symlink
stat:
path: "{{ ansible_env.HOME }}/.unsloth"
@@ -34,11 +23,6 @@
path: "{{ ansible_env.HOME }}/.unsloth/.courseware-managed"
register: courseware_down_unsloth_marker
- name: Stat conda environments file
stat:
path: "{{ ansible_env.HOME }}/.conda/environments.txt"
register: courseware_down_conda_envs
- name: Stat courseware-managed Ollama install marker
stat:
path: "{{ courseware_ollama_install_marker }}"
@@ -172,39 +156,6 @@
changed_when: false
failed_when: false
- name: Remove managed TransformerLab conda environment entry
lineinfile:
path: "{{ ansible_env.HOME }}/.conda/environments.txt"
regexp: "^{{ (courseware_transformerlab_home ~ '/envs/transformerlab') | regex_escape() }}$"
state: absent
when: courseware_down_conda_envs.stat.exists
failed_when: false
- name: Remove managed TransformerLab path
file:
path: "{{ ansible_env.HOME }}/.transformerlab"
state: absent
when:
- courseware_down_transformerlab.stat.exists
- >
(courseware_down_transformerlab.stat.islnk and
courseware_down_transformerlab.stat.lnk_source == courseware_transformerlab_home)
or courseware_down_transformerlab_marker.stat.exists
failed_when: false
- name: Remove managed TransformerLab home
file:
path: "{{ courseware_transformerlab_home }}"
state: absent
failed_when: false
- name: Remove legacy managed TransformerLab home
file:
path: "{{ courseware_transformerlab_legacy_home }}"
state: absent
when: courseware_transformerlab_legacy_home != courseware_transformerlab_home
failed_when: false
- name: Remove managed Unsloth path
file:
path: "{{ ansible_env.HOME }}/.unsloth"
+2 -1
View File
@@ -6,11 +6,12 @@
- { role: preflight, tags: ["preflight"] }
- directories
- packages
- netron
- lab1_assets
- lab_assets
- node_runtime
- { role: terminal, when: ansible_system == "Linux" }
- llama_cpp
- transformerlab
- open_webui
- chunkviz
- promptfoo
+2 -34
View File
@@ -15,10 +15,10 @@
- "{{ courseware_tools_dir }}"
- "{{ courseware_apps_dir }}"
- "{{ courseware_downloads_dir }}"
- "{{ courseware_lab1_dir }}"
- "{{ courseware_lab2_dir }}"
- "{{ courseware_safe_homes_dir }}"
- "{{ courseware_transformerlab_home }}"
- "{{ courseware_unsloth_home }}"
- "{{ courseware_lab1_models_dir }}"
- "{{ courseware_ollama_models_dir }}"
- name: Seed managed ownership markers
@@ -27,40 +27,8 @@
state: touch
mode: "0644"
loop:
- "{{ courseware_transformerlab_home }}/.courseware-managed"
- "{{ courseware_unsloth_home }}/.courseware-managed"
- name: Check existing TransformerLab path
stat:
path: "{{ ansible_env.HOME }}/.transformerlab"
follow: false
register: courseware_transformerlab_link
- name: Check existing TransformerLab ownership marker
stat:
path: "{{ ansible_env.HOME }}/.transformerlab/.courseware-managed"
register: courseware_transformerlab_marker
- name: Fail if TransformerLab path is already occupied
fail:
msg: "{{ ansible_env.HOME }}/.transformerlab already exists and is not managed by this project."
when:
- courseware_transformerlab_link.stat.exists
- >
(
(not courseware_transformerlab_link.stat.islnk) or
(courseware_transformerlab_link.stat.islnk and
courseware_transformerlab_link.stat.lnk_source != courseware_transformerlab_home)
) and
(not courseware_transformerlab_marker.stat.exists)
- name: Link TransformerLab home into project state
file:
src: "{{ courseware_transformerlab_home }}"
dest: "{{ ansible_env.HOME }}/.transformerlab"
state: link
force: true
- name: Check existing Unsloth path
stat:
path: "{{ ansible_env.HOME }}/.unsloth"
+71
View File
@@ -0,0 +1,71 @@
- name: Ensure Lab 1 model directory exists
file:
path: "{{ courseware_lab1_models_dir }}"
state: directory
mode: "0755"
- name: Check installed Ollama version
command:
argv:
- "{{ courseware_ollama_bin }}"
- --version
register: courseware_lab1_ollama_version
changed_when: false
- name: Extract installed Ollama semantic version
set_fact:
courseware_lab1_ollama_semver: >-
{{
courseware_lab1_ollama_version.stdout
| regex_search('[0-9]+\\.[0-9]+\\.[0-9]+')
| default('')
}}
- name: Fail when Ollama is too old for Lab 1 logprobs
fail:
msg: >-
Lab 1 requires Ollama {{ courseware_ollama_min_version }} or newer because
the confidence visualizer depends on logprob support. Installed version:
{{ courseware_lab1_ollama_version.stdout | trim }}.
when:
- courseware_lab1_ollama_semver | length == 0
or not (courseware_lab1_ollama_semver is version(courseware_ollama_min_version, '>='))
- name: Download mirrored Lab 1 Qwen model
get_url:
url: "{{ courseware_lab1_qwen_download_url }}"
dest: "{{ courseware_lab1_qwen_local_path }}"
mode: "0644"
- name: Download mirrored Lab 1 Llama model
get_url:
url: "{{ courseware_lab1_llama_download_url }}"
dest: "{{ courseware_lab1_llama_local_path }}"
mode: "0644"
- name: Write Lab 1 Ollama Modelfile
copy:
dest: "{{ courseware_lab1_dir }}/Modelfile.{{ courseware_lab1_qwen_model_alias }}"
mode: "0644"
content: |
FROM {{ courseware_lab1_qwen_local_path }}
- name: Start Ollama before Lab 1 model registration
command:
argv:
- "{{ courseware_root }}/scripts/service_manager.sh"
- start
- ollama
changed_when: false
- name: Register Lab 1 Qwen model with Ollama
command:
argv:
- "{{ courseware_ollama_bin }}"
- create
- "{{ courseware_lab1_qwen_model_alias }}"
- -f
- "{{ courseware_lab1_dir }}/Modelfile.{{ courseware_lab1_qwen_model_alias }}"
environment:
OLLAMA_HOST: "{{ courseware_bind_host }}:{{ courseware_ports.ollama }}"
OLLAMA_MODELS: "{{ courseware_ollama_models_dir }}"
+30
View File
@@ -0,0 +1,30 @@
- name: Create Netron virtual environment
command:
argv:
- "{{ courseware_python_bin }}"
- -m
- venv
- "{{ courseware_netron_venv_dir }}"
args:
creates: "{{ courseware_netron_venv_dir }}/bin/python"
- name: Upgrade Netron venv tooling
command:
argv:
- "{{ courseware_netron_venv_dir }}/bin/python"
- -m
- pip
- install
- --upgrade
- pip
- setuptools
- wheel
- name: Install Netron server runtime
command:
argv:
- "{{ courseware_netron_venv_dir }}/bin/python"
- -m
- pip
- install
- "netron=={{ courseware_netron_version }}"
+2 -2
View File
@@ -7,7 +7,7 @@
- name: Create Open WebUI virtual environment
command:
argv:
- "{{ courseware_transformerlab_home }}/envs/transformerlab/bin/python"
- "{{ courseware_python_bin }}"
- -m
- venv
- "{{ courseware_venvs_dir }}/open-webui"
@@ -39,7 +39,7 @@
- name: Create Embedding Atlas virtual environment
command:
argv:
- "{{ courseware_transformerlab_home }}/envs/transformerlab/bin/python"
- "{{ courseware_python_bin }}"
- -m
- venv
- "{{ courseware_venvs_dir }}/embedding-atlas"
@@ -1,3 +1,4 @@
{
"lab1NetronUrl": "http://{{ courseware_url_host }}:{{ courseware_ports.netron }}",
"lab3TerminalUrl": "http://{{ courseware_url_host }}:{{ courseware_ports.wetty }}{{ courseware_wetty_base_path }}"
}
+8 -4
View File
@@ -30,14 +30,18 @@
ansible.builtin.import_role:
name: ollama
- name: Include Netron setup
ansible.builtin.import_role:
name: netron
- name: Include Lab 1 asset setup
ansible.builtin.import_role:
name: lab1_assets
- name: Include llama.cpp setup
ansible.builtin.import_role:
name: llama-cpp
- name: Include Transformer Lab setup
ansible.builtin.import_role:
name: transformerlab
- name: Include Unsloth Studio setup
ansible.builtin.import_role:
name: unsloth
+7 -6
View File
@@ -5,16 +5,18 @@ COURSEWARE_BIND_HOST="{{ courseware_bind_host }}"
COURSEWARE_URL_HOST="{{ courseware_url_host }}"
COURSEWARE_OLLAMA_PORT="{{ courseware_ports.ollama }}"
COURSEWARE_OPEN_WEBUI_PORT="{{ courseware_ports.open_webui }}"
COURSEWARE_TRANSFORMERLAB_PORT="{{ courseware_ports.transformerlab }}"
COURSEWARE_NETRON_PORT="{{ courseware_ports.netron }}"
COURSEWARE_CHUNKVIZ_PORT="{{ courseware_ports.chunkviz }}"
COURSEWARE_EMBEDDING_ATLAS_PORT="{{ courseware_ports.embedding_atlas }}"
COURSEWARE_UNSLOTH_PORT="{{ courseware_ports.unsloth }}"
COURSEWARE_PROMPTFOO_PORT="{{ courseware_ports.promptfoo }}"
COURSEWARE_WIKI_PORT="{{ courseware_ports.wiki }}"
COURSEWARE_WETTY_PORT="{{ courseware_ports.wetty }}"
COURSEWARE_OLLAMA_MIN_VERSION="{{ courseware_ollama_min_version }}"
OLLAMA_BIN="{{ courseware_ollama_bin }}"
OLLAMA_MODELS_DIR="{{ courseware_ollama_models_dir }}"
NODE_RUNTIME_BIN_DIR="{{ courseware_node_runtime_bin_dir }}"
NETRON_VENV="{{ courseware_netron_venv_dir }}"
WETTY_BIN="{{ courseware_wetty_dir }}/node_modules/.bin/wetty"
COURSEWARE_WETTY_BASE_PATH="{{ courseware_wetty_base_path }}"
OPEN_WEBUI_VENV="{{ courseware_venvs_dir }}/open-webui"
@@ -23,11 +25,10 @@ CHUNKVIZ_DIR="{{ courseware_repos_dir }}/ChunkViz"
EMBEDDING_ATLAS_VENV="{{ courseware_venvs_dir }}/embedding-atlas"
TTPS_DATASET_PATH="{{ courseware_datasets_dir }}/ttps_dataset.parquet"
WIKI_TEST_RAW_PATH="{{ courseware_datasets_dir }}/wiki.test.raw"
TRANSFORMERLAB_DIR="{{ courseware_transformerlab_home }}"
TRANSFORMERLAB_DEFAULT_USER_EMAIL="{{ courseware_transformerlab_default_user_email }}"
TRANSFORMERLAB_DEFAULT_USER_PASSWORD="{{ courseware_transformerlab_default_user_password }}"
TRANSFORMERLAB_DEFAULT_USER_FIRST_NAME="{{ courseware_transformerlab_default_user_first_name }}"
TRANSFORMERLAB_DEFAULT_USER_LAST_NAME="{{ courseware_transformerlab_default_user_last_name }}"
COURSEWARE_OLLAMA_BASE_URL="http://{{ courseware_url_host }}:{{ courseware_ports.ollama }}"
COURSEWARE_LAB1_QWEN_MODEL_PATH="{{ courseware_lab1_qwen_local_path }}"
COURSEWARE_LAB1_LLAMA_MODEL_PATH="{{ courseware_lab1_llama_local_path }}"
COURSEWARE_LAB1_OLLAMA_MODEL_ALIAS="{{ courseware_lab1_qwen_model_alias }}"
UNSLOTH_BIN="{{ ansible_env.HOME }}/.local/bin/unsloth"
PROMPTFOO_DIR="{{ courseware_promptfoo_dir }}"
PROMPTFOO_BIN="{{ courseware_tools_dir }}/promptfoo/node_modules/.bin/promptfoo"