3lc-compute-plugin-yolo 0.2.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 3lc_compute_plugin_yolo-0.2.0/.github/workflows/ci.yml +33 -0
- 3lc_compute_plugin_yolo-0.2.0/.github/workflows/release.yml +111 -0
- 3lc_compute_plugin_yolo-0.2.0/.gitignore +14 -0
- 3lc_compute_plugin_yolo-0.2.0/CHANGELOG.md +76 -0
- 3lc_compute_plugin_yolo-0.2.0/LICENSE +661 -0
- 3lc_compute_plugin_yolo-0.2.0/PKG-INFO +13 -0
- 3lc_compute_plugin_yolo-0.2.0/README.md +49 -0
- 3lc_compute_plugin_yolo-0.2.0/pyproject.toml +82 -0
- 3lc_compute_plugin_yolo-0.2.0/src/tlc_plugin_yolo/__init__.py +330 -0
- 3lc_compute_plugin_yolo-0.2.0/src/tlc_plugin_yolo/models/__init__.py +48 -0
- 3lc_compute_plugin_yolo-0.2.0/src/tlc_plugin_yolo/models/base.py +56 -0
- 3lc_compute_plugin_yolo-0.2.0/src/tlc_plugin_yolo/models/yolo.py +792 -0
- 3lc_compute_plugin_yolo-0.2.0/src/tlc_plugin_yolo/plugin.toml +31 -0
- 3lc_compute_plugin_yolo-0.2.0/src/tlc_plugin_yolo/project_store.py +97 -0
- 3lc_compute_plugin_yolo-0.2.0/src/tlc_plugin_yolo/routes.py +151 -0
- 3lc_compute_plugin_yolo-0.2.0/src/tlc_plugin_yolo/runtime.py +38 -0
- 3lc_compute_plugin_yolo-0.2.0/src/tlc_plugin_yolo/task_detection.py +74 -0
- 3lc_compute_plugin_yolo-0.2.0/src/tlc_plugin_yolo/ui.html +1537 -0
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
pull_request:
|
|
5
|
+
branches: [main]
|
|
6
|
+
push:
|
|
7
|
+
branches: [main]
|
|
8
|
+
workflow_call:
|
|
9
|
+
|
|
10
|
+
concurrency:
|
|
11
|
+
group: ci-${{ github.ref }}
|
|
12
|
+
cancel-in-progress: true
|
|
13
|
+
|
|
14
|
+
jobs:
|
|
15
|
+
ruff:
|
|
16
|
+
name: ruff (lint + format)
|
|
17
|
+
runs-on: ubuntu-latest
|
|
18
|
+
steps:
|
|
19
|
+
- uses: actions/checkout@v4
|
|
20
|
+
|
|
21
|
+
- name: Install uv
|
|
22
|
+
uses: astral-sh/setup-uv@v5
|
|
23
|
+
with:
|
|
24
|
+
version: "0.8.15"
|
|
25
|
+
|
|
26
|
+
# Ruff runs STANDALONE (uvx): linting must not require resolving the per-plugin ML
|
|
27
|
+
# stacks (torch / timm / sam3 / ultralytics) — that would be slow and need extra
|
|
28
|
+
# indexes. Config lives in pyproject [tool.ruff]; pin matches 3lc-plugin-sdk.
|
|
29
|
+
- name: Ruff lint
|
|
30
|
+
run: uvx --from 'ruff>=0.15,<0.16' ruff check .
|
|
31
|
+
|
|
32
|
+
- name: Ruff format check
|
|
33
|
+
run: uvx --from 'ruff>=0.15,<0.16' ruff format --check .
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
name: Release
|
|
2
|
+
|
|
3
|
+
# Tag (`v*`) pushes publish to public PyPI via Trusted Publishing (GitHub OIDC, no secrets).
|
|
4
|
+
# Mirrors 3lc-compute-plugin-sdk / 3lc-compute-plugins release.yml. To cut a release: bump
|
|
5
|
+
# `version` in pyproject.toml AND src/tlc_plugin_yolo/plugin.toml (they move together),
|
|
6
|
+
# update CHANGELOG.md, commit, then push a tag `vX.Y.Z` that matches the version.
|
|
7
|
+
#
|
|
8
|
+
# Manual (workflow_dispatch) runs publish build-numbered prereleases to the legacy CloudRepo
|
|
9
|
+
# index (pypi.3lc.ai) — kept as a grace-period fallback; retire that job (and the CLOUDREPO_*
|
|
10
|
+
# secrets/vars on the "release" environment) once nothing consumes the CloudRepo index. The
|
|
11
|
+
# split deliberately keeps build-numbered versions OFF PyPI: `X.Y.Z.N` sorts above `X.Y.Z`,
|
|
12
|
+
# so a prerelease build would win over the real release in `>=X.Y,<X.Y+1`-style pins.
|
|
13
|
+
#
|
|
14
|
+
# NOTE: `uv build --no-sources` builds the WHEEL only — it does not resolve or install the
|
|
15
|
+
# heavy [yolo] extra. The wheel's metadata carries the SDK pin and the extra's dependency
|
|
16
|
+
# list, resolved from their indexes at install time.
|
|
17
|
+
|
|
18
|
+
on:
|
|
19
|
+
push:
|
|
20
|
+
tags: ["v*"]
|
|
21
|
+
workflow_dispatch:
|
|
22
|
+
|
|
23
|
+
jobs:
|
|
24
|
+
# Gate the release on CI (ruff lint + format). ci.yml is reusable via workflow_call.
|
|
25
|
+
test:
|
|
26
|
+
uses: ./.github/workflows/ci.yml
|
|
27
|
+
secrets: inherit
|
|
28
|
+
|
|
29
|
+
# Tag (`v*`) pushes → the real release, to public PyPI.
|
|
30
|
+
publish-pypi:
|
|
31
|
+
if: github.event_name == 'push'
|
|
32
|
+
needs: test
|
|
33
|
+
runs-on: ubuntu-latest
|
|
34
|
+
environment: release
|
|
35
|
+
permissions:
|
|
36
|
+
contents: read
|
|
37
|
+
id-token: write # OIDC token for PyPI Trusted Publishing
|
|
38
|
+
steps:
|
|
39
|
+
- uses: actions/checkout@v4
|
|
40
|
+
|
|
41
|
+
- name: Install uv
|
|
42
|
+
uses: astral-sh/setup-uv@v5
|
|
43
|
+
with:
|
|
44
|
+
version: "0.8.15"
|
|
45
|
+
|
|
46
|
+
- name: Verify tag matches pyproject version
|
|
47
|
+
run: |
|
|
48
|
+
PKG=$(uv version --output-format json | jq -r '.version')
|
|
49
|
+
TAG="${GITHUB_REF_NAME#v}"
|
|
50
|
+
echo "pyproject=$PKG tag=$TAG"
|
|
51
|
+
[ "$PKG" = "$TAG" ] || { echo "::error::tag $GITHUB_REF_NAME ($TAG) != pyproject version $PKG"; exit 1; }
|
|
52
|
+
|
|
53
|
+
# The version the plugin card reports comes from its manifest; a tag with a drifting
|
|
54
|
+
# manifest would ship a plugin that misreports its own release.
|
|
55
|
+
- name: Verify plugin manifest matches pyproject version
|
|
56
|
+
run: |
|
|
57
|
+
PKG=$(uv version --output-format json | jq -r '.version')
|
|
58
|
+
FAIL=0
|
|
59
|
+
for MANIFEST in src/*/plugin.toml; do
|
|
60
|
+
V=$(grep -Po '^version\s*=\s*"\K[^"]+' "$MANIFEST")
|
|
61
|
+
echo "$MANIFEST: $V"
|
|
62
|
+
[ "$V" = "$PKG" ] || { echo "::error::$MANIFEST version $V != pyproject version $PKG"; FAIL=1; }
|
|
63
|
+
done
|
|
64
|
+
exit $FAIL
|
|
65
|
+
|
|
66
|
+
# --no-sources strips [tool.uv.sources] so the released wheel never bakes in a dev
|
|
67
|
+
# index/path override (the published artifact resolves deps from PyPI).
|
|
68
|
+
- name: Build
|
|
69
|
+
run: uv build --no-sources
|
|
70
|
+
|
|
71
|
+
- name: Publish to PyPI
|
|
72
|
+
run: uv publish --trusted-publishing always
|
|
73
|
+
|
|
74
|
+
# Manual (workflow_dispatch) runs → build-numbered prereleases to the legacy CloudRepo index.
|
|
75
|
+
publish-cloudrepo-prerelease:
|
|
76
|
+
if: github.event_name == 'workflow_dispatch'
|
|
77
|
+
needs: test
|
|
78
|
+
runs-on: ubuntu-latest
|
|
79
|
+
environment: release
|
|
80
|
+
env:
|
|
81
|
+
UV_PUBLISH_URL: ${{ vars.CLOUDREPO_PUBLISH_URL }}
|
|
82
|
+
UV_PUBLISH_USERNAME: ${{ secrets.CLOUDREPO_USERNAME }}
|
|
83
|
+
UV_PUBLISH_PASSWORD: ${{ secrets.CLOUDREPO_PASSWORD }}
|
|
84
|
+
steps:
|
|
85
|
+
- uses: actions/checkout@v4
|
|
86
|
+
|
|
87
|
+
- name: Install uv
|
|
88
|
+
uses: astral-sh/setup-uv@v5
|
|
89
|
+
with:
|
|
90
|
+
version: "0.8.15"
|
|
91
|
+
|
|
92
|
+
- name: Verify the 'release' environment is configured
|
|
93
|
+
run: |
|
|
94
|
+
: "${UV_PUBLISH_URL:?set the CLOUDREPO_PUBLISH_URL variable on the 'release' environment}"
|
|
95
|
+
: "${UV_PUBLISH_USERNAME:?set the CLOUDREPO_USERNAME secret on the 'release' environment}"
|
|
96
|
+
: "${UV_PUBLISH_PASSWORD:?set the CLOUDREPO_PASSWORD secret on the 'release' environment}"
|
|
97
|
+
|
|
98
|
+
# A 4th version segment keeps every prerelease publish unique (CloudRepo has overwrites
|
|
99
|
+
# disabled) while sorting above the base version, so `<X.Y+1`-style pins still resolve it
|
|
100
|
+
# — unlike `.devN` (sorts below) or `+localN` (rejected on upload).
|
|
101
|
+
- name: Stamp build-numbered version
|
|
102
|
+
run: |
|
|
103
|
+
BASE=$(uv version --output-format json | jq -r '.version')
|
|
104
|
+
uv version "${BASE}.${GITHUB_RUN_NUMBER}"
|
|
105
|
+
echo "prerelease build version: ${BASE}.${GITHUB_RUN_NUMBER}"
|
|
106
|
+
|
|
107
|
+
- name: Build
|
|
108
|
+
run: uv build --no-sources
|
|
109
|
+
|
|
110
|
+
- name: Publish to CloudRepo
|
|
111
|
+
run: uv publish
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to `3lc-compute-plugin-yolo` are documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
## [Unreleased]
|
|
9
|
+
|
|
10
|
+
Nothing yet.
|
|
11
|
+
|
|
12
|
+
## [0.2.0] - 2026-08-19
|
|
13
|
+
|
|
14
|
+
Also covers the unreleased 0.1.5 bump (#4), which was never tagged.
|
|
15
|
+
|
|
16
|
+
### Added
|
|
17
|
+
- The pretrained-checkpoint field uses the SDK's shared data-source picker: browse the compute
|
|
18
|
+
node's filesystem (confined to operator-configured roots) instead of typing a path blind.
|
|
19
|
+
The SDK's `/browse` route is mounted alongside the plugin's own routes (#7).
|
|
20
|
+
|
|
21
|
+
### Changed
|
|
22
|
+
- **Distribution moved to PyPI**: tagged releases publish `3lc-compute-plugin-yolo` to public
|
|
23
|
+
PyPI via Trusted Publishing; the CloudRepo index (pypi.3lc.ai) is no longer needed to install
|
|
24
|
+
the plugin. Manual prerelease builds keep publishing to CloudRepo for a grace period (#7).
|
|
25
|
+
- The plugin SDK pin is `>=0.2.2,<0.3.0`, resolved from public PyPI (the SDK's home since
|
|
26
|
+
0.2.2) — no custom indexes remain besides the CUDA torch index (#7). Earlier steps on the
|
|
27
|
+
way: the pin was widened to `>=0.2.0,<0.3.0` (#3), and `3lc` moved to public PyPI with the
|
|
28
|
+
3.2 rust release (#5).
|
|
29
|
+
- The plugin presents itself as "Ultralytics YOLO" and surfaces the Ultralytics dual-license
|
|
30
|
+
terms (AGPL-3.0 / Enterprise License) in the manifest and README (#4).
|
|
31
|
+
|
|
32
|
+
### Fixed
|
|
33
|
+
- Training jobs are attributed to the configured 3LC project in the generic Queue &
|
|
34
|
+
Progress panel: the run request now carries `project_name`, which the host reads from
|
|
35
|
+
the request body only — the value stored in the saved config never reached the job
|
|
36
|
+
record, so jobs were hidden from every project-filtered view (#6).
|
|
37
|
+
- A `~`-prefixed pretrained-checkpoint path is expanded at ingress instead of reaching the
|
|
38
|
+
model loader literally and failing mid-job with an opaque file-not-found (#7).
|
|
39
|
+
|
|
40
|
+
## [0.1.4] - 2026-08-07
|
|
41
|
+
|
|
42
|
+
### Changed
|
|
43
|
+
- The `[yolo]` extra requires `3lc-ultralytics>=0.4.0`.
|
|
44
|
+
|
|
45
|
+
## [0.1.3] - 2026-07-03
|
|
46
|
+
|
|
47
|
+
### Fixed
|
|
48
|
+
- The plugin manifest version and the distribution version are bumped together, so the version
|
|
49
|
+
the plugin card reports matches the installed distribution.
|
|
50
|
+
|
|
51
|
+
## [0.1.2] - 2026-07-03
|
|
52
|
+
|
|
53
|
+
### Fixed
|
|
54
|
+
- The CUDA torch index is applied on Windows as well as Linux, so GPU-enabled installs work on
|
|
55
|
+
Windows hosts.
|
|
56
|
+
|
|
57
|
+
### Changed
|
|
58
|
+
- The plugin SDK dependency is resolved from the public package index under its final name
|
|
59
|
+
`3lc-compute-plugin-sdk` (was a git pin).
|
|
60
|
+
|
|
61
|
+
## [0.1.1] - 2026-07-01
|
|
62
|
+
|
|
63
|
+
### Added
|
|
64
|
+
- `3lc[pacmap,umap]` extras added to the `[yolo]` provision extra, so embedding visualizations
|
|
65
|
+
work out of the box.
|
|
66
|
+
|
|
67
|
+
## [0.1.0] - 2026-07-01
|
|
68
|
+
|
|
69
|
+
First release, extracted from the `3lc-compute-plugins` umbrella into its own repository.
|
|
70
|
+
|
|
71
|
+
### Added
|
|
72
|
+
- The YOLO training plugin for the 3LC compute service: fine-tune YOLO detection and
|
|
73
|
+
segmentation models on 3LC tables via the Ultralytics stack, with per-sample metrics and
|
|
74
|
+
embeddings collected to 3LC runs. GPU-classed and venv-isolated; distributed as
|
|
75
|
+
`3lc-compute-plugin-yolo`. This plugin carries the AGPL-licensed Ultralytics dependency stack
|
|
76
|
+
in its own isolated venv (the reason it lives in a standalone repository).
|