raylim Claude Sonnet 4.5 commited on
Commit
91ec300
·
unverified ·
1 Parent(s): 40c55e4

Configure Docker build with SSH authentication for private repos

Browse files

- Update Dockerfile to use SSH forwarding for private dependencies (paladin, Mussel)
- Add build.sh script to handle SSH agent setup for local builds
- Update pyproject.toml to use SSH URLs for private repos
- Configure GitHub Actions workflow for SSH-based Docker builds
- Add SSH agent setup with webfactory/ssh-agent action
- Configure dual registry support (GHCR + Docker Hub)
- Push to GHCR on all branches, Docker Hub only on main
- Update Makefile to use mskmind/mosaic as default image name
- Add CI/CD documentation to CONTRIBUTING.md
- Add github_token to .gitignore

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>

Files changed (8) hide show
  1. .github/workflows/docker.yml +58 -15
  2. .gitignore +4 -0
  3. CONTRIBUTING.md +50 -0
  4. Dockerfile +17 -17
  5. Makefile +11 -5
  6. build.sh +15 -0
  7. pyproject.toml +1 -1
  8. uv.lock +8 -8
.github/workflows/docker.yml CHANGED
@@ -10,8 +10,10 @@ on:
10
  workflow_dispatch:
11
 
12
  env:
13
- REGISTRY: ghcr.io
 
14
  IMAGE_NAME: ${{ github.repository }}
 
15
 
16
  jobs:
17
  build:
@@ -33,19 +35,27 @@ jobs:
33
  - name: Set up Docker Buildx
34
  uses: docker/setup-buildx-action@v3
35
 
36
- - name: Log in to Container Registry
37
  if: github.event_name != 'pull_request'
38
  uses: docker/login-action@v3
39
  with:
40
- registry: ${{ env.REGISTRY }}
41
  username: ${{ github.actor }}
42
  password: ${{ secrets.GITHUB_TOKEN }}
43
 
44
- - name: Extract metadata
45
- id: meta
 
 
 
 
 
 
 
 
46
  uses: docker/metadata-action@v5
47
  with:
48
- images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
49
  tags: |
50
  type=ref,event=branch
51
  type=ref,event=pr
@@ -53,27 +63,60 @@ jobs:
53
  type=semver,pattern={{major}}.{{minor}}
54
  type=sha,prefix={{branch}}-
55
 
56
- - name: Build and push Docker image
 
 
 
 
 
 
 
 
 
 
 
 
57
  uses: docker/build-push-action@v5
58
  with:
59
  context: .
60
  push: ${{ github.event_name != 'pull_request' }}
61
- tags: ${{ steps.meta.outputs.tags }}
62
- labels: ${{ steps.meta.outputs.labels }}
63
- ssh: default
64
  cache-from: type=gha
65
  cache-to: type=gha,mode=max
66
- secrets: |
67
- github_token=${{ secrets.GITHUB_TOKEN }}
 
 
 
 
 
 
 
 
 
68
 
69
  - name: Docker Summary
70
  run: |
71
  echo "## Docker Build :whale:" >> $GITHUB_STEP_SUMMARY
72
  echo "" >> $GITHUB_STEP_SUMMARY
73
- echo "Registry: ${{ env.REGISTRY }}" >> $GITHUB_STEP_SUMMARY
 
74
  echo "Image: ${{ env.IMAGE_NAME }}" >> $GITHUB_STEP_SUMMARY
75
  echo "" >> $GITHUB_STEP_SUMMARY
76
- echo "### Tags" >> $GITHUB_STEP_SUMMARY
77
  echo '```' >> $GITHUB_STEP_SUMMARY
78
- echo "${{ steps.meta.outputs.tags }}" >> $GITHUB_STEP_SUMMARY
79
  echo '```' >> $GITHUB_STEP_SUMMARY
 
 
 
 
 
 
 
 
 
 
 
 
10
  workflow_dispatch:
11
 
12
  env:
13
+ GHCR_REGISTRY: ghcr.io
14
+ DOCKER_REGISTRY: docker.io
15
  IMAGE_NAME: ${{ github.repository }}
16
+ DOCKER_HUB_IMAGE: mskmind/mosaic
17
 
18
  jobs:
19
  build:
 
35
  - name: Set up Docker Buildx
36
  uses: docker/setup-buildx-action@v3
37
 
38
+ - name: Log in to GitHub Container Registry
39
  if: github.event_name != 'pull_request'
40
  uses: docker/login-action@v3
41
  with:
42
+ registry: ${{ env.GHCR_REGISTRY }}
43
  username: ${{ github.actor }}
44
  password: ${{ secrets.GITHUB_TOKEN }}
45
 
46
+ - name: Log in to Docker Hub
47
+ if: github.event_name != 'pull_request' && github.ref == 'refs/heads/main'
48
+ uses: docker/login-action@v3
49
+ with:
50
+ registry: ${{ env.DOCKER_REGISTRY }}
51
+ username: ${{ secrets.DOCKER_HUB_USERNAME }}
52
+ password: ${{ secrets.DOCKER_HUB_TOKEN }}
53
+
54
+ - name: Extract metadata for GHCR
55
+ id: meta-ghcr
56
  uses: docker/metadata-action@v5
57
  with:
58
+ images: ${{ env.GHCR_REGISTRY }}/${{ env.IMAGE_NAME }}
59
  tags: |
60
  type=ref,event=branch
61
  type=ref,event=pr
 
63
  type=semver,pattern={{major}}.{{minor}}
64
  type=sha,prefix={{branch}}-
65
 
66
+ - name: Extract metadata for Docker Hub
67
+ id: meta-dockerhub
68
+ if: github.ref == 'refs/heads/main'
69
+ uses: docker/metadata-action@v5
70
+ with:
71
+ images: ${{ env.DOCKER_REGISTRY }}/${{ env.DOCKER_HUB_IMAGE }}
72
+ tags: |
73
+ type=raw,value=latest
74
+ type=semver,pattern={{version}}
75
+ type=semver,pattern={{major}}.{{minor}}
76
+ type=sha
77
+
78
+ - name: Build and push to GHCR
79
  uses: docker/build-push-action@v5
80
  with:
81
  context: .
82
  push: ${{ github.event_name != 'pull_request' }}
83
+ tags: ${{ steps.meta-ghcr.outputs.tags }}
84
+ labels: ${{ steps.meta-ghcr.outputs.labels }}
85
+ ssh: default=${{ env.SSH_AUTH_SOCK }}
86
  cache-from: type=gha
87
  cache-to: type=gha,mode=max
88
+
89
+ - name: Build and push to Docker Hub
90
+ if: github.event_name != 'pull_request' && github.ref == 'refs/heads/main'
91
+ uses: docker/build-push-action@v5
92
+ with:
93
+ context: .
94
+ push: true
95
+ tags: ${{ steps.meta-dockerhub.outputs.tags }}
96
+ labels: ${{ steps.meta-dockerhub.outputs.labels }}
97
+ ssh: default=${{ env.SSH_AUTH_SOCK }}
98
+ cache-from: type=gha
99
 
100
  - name: Docker Summary
101
  run: |
102
  echo "## Docker Build :whale:" >> $GITHUB_STEP_SUMMARY
103
  echo "" >> $GITHUB_STEP_SUMMARY
104
+ echo "### GitHub Container Registry" >> $GITHUB_STEP_SUMMARY
105
+ echo "Registry: ${{ env.GHCR_REGISTRY }}" >> $GITHUB_STEP_SUMMARY
106
  echo "Image: ${{ env.IMAGE_NAME }}" >> $GITHUB_STEP_SUMMARY
107
  echo "" >> $GITHUB_STEP_SUMMARY
108
+ echo "**Tags:**" >> $GITHUB_STEP_SUMMARY
109
  echo '```' >> $GITHUB_STEP_SUMMARY
110
+ echo "${{ steps.meta-ghcr.outputs.tags }}" >> $GITHUB_STEP_SUMMARY
111
  echo '```' >> $GITHUB_STEP_SUMMARY
112
+ if [ "${{ github.ref }}" == "refs/heads/main" ]; then
113
+ echo "" >> $GITHUB_STEP_SUMMARY
114
+ echo "### Docker Hub" >> $GITHUB_STEP_SUMMARY
115
+ echo "Registry: ${{ env.DOCKER_REGISTRY }}" >> $GITHUB_STEP_SUMMARY
116
+ echo "Image: ${{ env.DOCKER_HUB_IMAGE }}" >> $GITHUB_STEP_SUMMARY
117
+ echo "" >> $GITHUB_STEP_SUMMARY
118
+ echo "**Tags:**" >> $GITHUB_STEP_SUMMARY
119
+ echo '```' >> $GITHUB_STEP_SUMMARY
120
+ echo "${{ steps.meta-dockerhub.outputs.tags }}" >> $GITHUB_STEP_SUMMARY
121
+ echo '```' >> $GITHUB_STEP_SUMMARY
122
+ fi
.gitignore CHANGED
@@ -19,3 +19,7 @@ flagged/
19
  gradio_cached_examples/
20
  *.svs
21
  *.png
 
 
 
 
 
19
  gradio_cached_examples/
20
  *.svs
21
  *.png
22
+
23
+ # GitHub tokens and secrets
24
+ github_token
25
+ *_token
CONTRIBUTING.md CHANGED
@@ -256,6 +256,56 @@ When adding new features:
256
  - Ensure dependencies are compatible with the project's license
257
  - Pin dependency versions in `pyproject.toml`
258
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
259
  ## Questions?
260
 
261
  If you have questions about contributing, please:
 
256
  - Ensure dependencies are compatible with the project's license
257
  - Pin dependency versions in `pyproject.toml`
258
 
259
+ ## GitHub Actions CI/CD
260
+
261
+ ### Required Repository Secrets
262
+
263
+ For the Docker build workflow to work properly in GitHub Actions, the following secrets must be configured in your repository settings (Settings → Secrets and variables → Actions):
264
+
265
+ 1. **`SSH_PRIVATE_KEY`** (Required)
266
+ - Your SSH private key that has access to the private repositories (paladin and Mussel)
267
+ - Generate with: `ssh-keygen -t ed25519 -C "github-actions@mosaic"`
268
+ - Add the public key to your GitHub account with repo access
269
+ - Add the private key to GitHub secrets
270
+
271
+ 2. **`DOCKER_HUB_USERNAME`** (Optional - only needed for Docker Hub pushes)
272
+ - Your Docker Hub username
273
+ - Required only if you want to push images to Docker Hub (on main branch)
274
+
275
+ 3. **`DOCKER_HUB_TOKEN`** (Optional - only needed for Docker Hub pushes)
276
+ - Your Docker Hub access token
277
+ - Generate at: https://hub.docker.com/settings/security
278
+ - Required only if you want to push images to Docker Hub (on main branch)
279
+
280
+ ### CI/CD Workflows
281
+
282
+ The project includes several GitHub Actions workflows:
283
+
284
+ - **`tests.yml`** - Runs pytest test suite on every push/PR
285
+ - **`code-quality.yml`** - Runs black and pylint checks
286
+ - **`docker.yml`** - Builds and pushes Docker images:
287
+ - Builds on every push to main/dev branches and PRs
288
+ - Pushes to GitHub Container Registry (ghcr.io) for all branches
289
+ - Pushes to Docker Hub (docker.io/mskmind/mosaic) only on main branch
290
+
291
+ ### Docker Build Process
292
+
293
+ The Docker build uses SSH forwarding to access private dependencies:
294
+
295
+ ```bash
296
+ # Local build (using build.sh)
297
+ ./build.sh
298
+
299
+ # Or using Make
300
+ make docker-build
301
+ ```
302
+
303
+ The GitHub Actions workflow automatically:
304
+ 1. Sets up SSH agent with the private key
305
+ 2. Configures Docker Buildx with SSH forwarding
306
+ 3. Builds the image with access to private repositories
307
+ 4. Pushes to GHCR and optionally Docker Hub
308
+
309
  ## Questions?
310
 
311
  If you have questions about contributing, please:
Dockerfile CHANGED
@@ -4,35 +4,35 @@ FROM python:3.10-slim AS env-builder
4
  RUN apt-get update && apt-get install -y \
5
  build-essential \
6
  curl \
7
- git gh \
8
- vim \
9
  && rm -rf /var/lib/apt/lists/*
10
 
11
  # Install uv
12
  COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/
13
 
14
- # Clone paladin repo
15
- WORKDIR /deps
16
- RUN --mount=type=secret,id=github_token \
17
- export GITHUB_TOKEN=$(cat /run/secrets/github_token) && \
18
- git clone --branch dev https://oauth2:$GITHUB_TOKEN@github.com/pathology-data-mining/paladin.git
19
-
20
- # Create non-root user for runtime
21
- RUN useradd -m -u 1000 user
22
- RUN chown -R user:user /deps
23
 
24
  WORKDIR /app
25
- RUN chown -R user:user /app
 
 
 
 
 
 
 
 
 
 
 
 
26
 
27
  USER user
28
- COPY --chown=user pyproject.toml README.md ./
29
- COPY --chown=user src/ ./src/
30
 
31
- RUN uv sync
32
  ENV PATH="/app/.venv/bin:$PATH"
33
 
34
  EXPOSE 7877
35
 
36
- # HEALTHCHECK CMD curl --fail http://localhost:8501/_stcore/health
37
-
38
  ENTRYPOINT ["gradio_app"]
 
4
  RUN apt-get update && apt-get install -y \
5
  build-essential \
6
  curl \
7
+ git \
8
+ openssh-client \
9
  && rm -rf /var/lib/apt/lists/*
10
 
11
  # Install uv
12
  COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/
13
 
14
+ # Setup SSH for git (as root)
15
+ RUN mkdir -p /root/.ssh && ssh-keyscan github.com >> /root/.ssh/known_hosts
 
 
 
 
 
 
 
16
 
17
  WORKDIR /app
18
+
19
+ # Copy project files
20
+ COPY pyproject.toml README.md ./
21
+ COPY src/ ./src/
22
+
23
+ # Create venv and install with dependencies (as root, before switching users)
24
+ RUN --mount=type=ssh \
25
+ uv venv && \
26
+ uv pip install -e .
27
+
28
+ # Create non-root user for runtime
29
+ RUN useradd -m -u 1000 user && \
30
+ chown -R user:user /app
31
 
32
  USER user
 
 
33
 
 
34
  ENV PATH="/app/.venv/bin:$PATH"
35
 
36
  EXPOSE 7877
37
 
 
 
38
  ENTRYPOINT ["gradio_app"]
Makefile CHANGED
@@ -4,9 +4,9 @@
4
  .DEFAULT_GOAL := help
5
 
6
  # Variables
7
- DOCKER_IMAGE_NAME := mosaic
8
  DOCKER_TAG := latest
9
- DOCKER_REGISTRY := # Set your registry here (e.g., docker.io/username)
10
  PYTHON := uv run python
11
  PYTEST := uv run pytest
12
  BLACK := uv run black
@@ -83,11 +83,17 @@ run-batch: ## Run batch analysis from CSV (usage: make run-batch CSV=settings.cs
83
 
84
  ##@ Docker
85
 
86
- docker-build: ## Build Docker image
87
- docker build -t $(DOCKER_IMAGE_NAME):$(DOCKER_TAG) .
 
88
 
89
  docker-build-no-cache: ## Build Docker image without cache
90
- docker build --no-cache -t $(DOCKER_IMAGE_NAME):$(DOCKER_TAG) .
 
 
 
 
 
91
 
92
  docker-run: ## Run Docker container (web UI mode)
93
  docker run -it --rm \
 
4
  .DEFAULT_GOAL := help
5
 
6
  # Variables
7
+ DOCKER_IMAGE_NAME := mskmind/mosaic
8
  DOCKER_TAG := latest
9
+ DOCKER_REGISTRY := docker.io
10
  PYTHON := uv run python
11
  PYTEST := uv run pytest
12
  BLACK := uv run black
 
83
 
84
  ##@ Docker
85
 
86
+ docker-build: ## Build Docker image with SSH forwarding
87
+ @echo "Building Docker image with SSH authentication..."
88
+ @./build.sh
89
 
90
  docker-build-no-cache: ## Build Docker image without cache
91
+ @echo "Building Docker image with SSH authentication (no cache)..."
92
+ @eval "$$(ssh-agent -s)" && \
93
+ ssh-add ~/.ssh/id_ed25519 && \
94
+ export DOCKER_BUILDKIT=1 && \
95
+ docker build --no-cache --ssh default=$$SSH_AUTH_SOCK -t $(DOCKER_IMAGE_NAME):$(DOCKER_TAG) . && \
96
+ eval "$$(ssh-agent -k)"
97
 
98
  docker-run: ## Run Docker container (web UI mode)
99
  docker run -it --rm \
build.sh ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/bash
2
+ set -e
3
+
4
+ # Start SSH agent and add key
5
+ eval "$(ssh-agent -s)"
6
+ ssh-add ~/.ssh/id_ed25519
7
+
8
+ # Enable BuildKit
9
+ export DOCKER_BUILDKIT=1
10
+
11
+ # Build with SSH forwarding
12
+ docker build --ssh default=$SSH_AUTH_SOCK -t mskmind/mosaic:latest .
13
+
14
+ # Kill SSH agent
15
+ eval "$(ssh-agent -k)"
pyproject.toml CHANGED
@@ -43,7 +43,7 @@ disable = [
43
 
44
  [tool.uv.sources]
45
  paladin = { git = "ssh://git@github.com/pathology-data-mining/paladin.git", rev = "dev" }
46
- mussel = { git = "https://github.com/pathology-data-mining/Mussel.git", rev = "mosaic-dev" }
47
 
48
  [tool.pytest.ini_options]
49
  testpaths = ["tests"]
 
43
 
44
  [tool.uv.sources]
45
  paladin = { git = "ssh://git@github.com/pathology-data-mining/paladin.git", rev = "dev" }
46
+ mussel = { git = "ssh://git@github.com/pathology-data-mining/Mussel.git", rev = "mosaic-dev" }
47
 
48
  [tool.pytest.ini_options]
49
  testpaths = ["tests"]
uv.lock CHANGED
@@ -1803,7 +1803,7 @@ requires-dist = [
1803
  { name = "lightning", specifier = ">=2.6.0" },
1804
  { name = "loguru", specifier = ">=0.7.3" },
1805
  { name = "memory-profiler", specifier = ">=0.61.0" },
1806
- { name = "mussel", extras = ["torch-gpu"], git = "https://github.com/pathology-data-mining/Mussel.git?rev=mosaic-dev" },
1807
  { name = "paladin", git = "ssh://git@github.com/pathology-data-mining/paladin.git?rev=dev" },
1808
  { name = "seaborn", specifier = ">=0.13.2" },
1809
  { name = "spaces", specifier = ">=0.30.0" },
@@ -1879,7 +1879,7 @@ wheels = [
1879
  [[package]]
1880
  name = "mussel"
1881
  version = "1.1.1"
1882
- source = { git = "https://github.com/pathology-data-mining/Mussel.git?rev=mosaic-dev#c848d4dc07845198cff79e9ddc0b261976846095" }
1883
  dependencies = [
1884
  { name = "configargparse" },
1885
  { name = "einops" },
@@ -2082,7 +2082,7 @@ name = "nvidia-cudnn-cu12"
2082
  version = "9.1.0.70"
2083
  source = { registry = "https://pypi.org/simple" }
2084
  dependencies = [
2085
- { name = "nvidia-cublas-cu12", marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux')" },
2086
  ]
2087
  wheels = [
2088
  { url = "https://files.pythonhosted.org/packages/9f/fd/713452cd72343f682b1c7b9321e23829f00b842ceaedcda96e742ea0b0b3/nvidia_cudnn_cu12-9.1.0.70-py3-none-manylinux2014_x86_64.whl", hash = "sha256:165764f44ef8c61fcdfdfdbe769d687e06374059fbb388b6c89ecb0e28793a6f", size = 664752741, upload-time = "2024-04-22T15:24:15.253Z" },
@@ -2109,9 +2109,9 @@ name = "nvidia-cusolver-cu12"
2109
  version = "11.4.5.107"
2110
  source = { registry = "https://pypi.org/simple" }
2111
  dependencies = [
2112
- { name = "nvidia-cublas-cu12", marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux')" },
2113
- { name = "nvidia-cusparse-cu12", marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux')" },
2114
- { name = "nvidia-nvjitlink-cu12", marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux')" },
2115
  ]
2116
  wheels = [
2117
  { url = "https://files.pythonhosted.org/packages/bc/1d/8de1e5c67099015c834315e333911273a8c6aaba78923dd1d1e25fc5f217/nvidia_cusolver_cu12-11.4.5.107-py3-none-manylinux1_x86_64.whl", hash = "sha256:8a7ec542f0412294b15072fa7dab71d31334014a69f953004ea7a118206fe0dd", size = 124161928, upload-time = "2023-04-19T15:51:25.781Z" },
@@ -2122,7 +2122,7 @@ name = "nvidia-cusparse-cu12"
2122
  version = "12.1.0.106"
2123
  source = { registry = "https://pypi.org/simple" }
2124
  dependencies = [
2125
- { name = "nvidia-nvjitlink-cu12", marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux')" },
2126
  ]
2127
  wheels = [
2128
  { url = "https://files.pythonhosted.org/packages/65/5b/cfaeebf25cd9fdec14338ccb16f6b2c4c7fa9163aefcf057d86b9cc248bb/nvidia_cusparse_cu12-12.1.0.106-py3-none-manylinux1_x86_64.whl", hash = "sha256:f3b50f42cf363f86ab21f720998517a659a48131e8d538dc02f8768237bd884c", size = 195958278, upload-time = "2023-04-19T15:51:49.939Z" },
@@ -3833,7 +3833,7 @@ name = "triton"
3833
  version = "3.1.0"
3834
  source = { registry = "https://pypi.org/simple" }
3835
  dependencies = [
3836
- { name = "filelock", marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux')" },
3837
  ]
3838
  wheels = [
3839
  { url = "https://files.pythonhosted.org/packages/98/29/69aa56dc0b2eb2602b553881e34243475ea2afd9699be042316842788ff5/triton-3.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b0dd10a925263abbe9fa37dcde67a5e9b2383fc269fdf59f5657cac38c5d1d8", size = 209460013, upload-time = "2024-10-14T16:05:32.106Z" },
 
1803
  { name = "lightning", specifier = ">=2.6.0" },
1804
  { name = "loguru", specifier = ">=0.7.3" },
1805
  { name = "memory-profiler", specifier = ">=0.61.0" },
1806
+ { name = "mussel", extras = ["torch-gpu"], git = "ssh://git@github.com/pathology-data-mining/Mussel.git?rev=mosaic-dev" },
1807
  { name = "paladin", git = "ssh://git@github.com/pathology-data-mining/paladin.git?rev=dev" },
1808
  { name = "seaborn", specifier = ">=0.13.2" },
1809
  { name = "spaces", specifier = ">=0.30.0" },
 
1879
  [[package]]
1880
  name = "mussel"
1881
  version = "1.1.1"
1882
+ source = { git = "ssh://git@github.com/pathology-data-mining/Mussel.git?rev=mosaic-dev#c848d4dc07845198cff79e9ddc0b261976846095" }
1883
  dependencies = [
1884
  { name = "configargparse" },
1885
  { name = "einops" },
 
2082
  version = "9.1.0.70"
2083
  source = { registry = "https://pypi.org/simple" }
2084
  dependencies = [
2085
+ { name = "nvidia-cublas-cu12", marker = "platform_machine != 'aarch64' and sys_platform == 'linux'" },
2086
  ]
2087
  wheels = [
2088
  { url = "https://files.pythonhosted.org/packages/9f/fd/713452cd72343f682b1c7b9321e23829f00b842ceaedcda96e742ea0b0b3/nvidia_cudnn_cu12-9.1.0.70-py3-none-manylinux2014_x86_64.whl", hash = "sha256:165764f44ef8c61fcdfdfdbe769d687e06374059fbb388b6c89ecb0e28793a6f", size = 664752741, upload-time = "2024-04-22T15:24:15.253Z" },
 
2109
  version = "11.4.5.107"
2110
  source = { registry = "https://pypi.org/simple" }
2111
  dependencies = [
2112
+ { name = "nvidia-cublas-cu12", marker = "platform_machine != 'aarch64' and sys_platform == 'linux'" },
2113
+ { name = "nvidia-cusparse-cu12", marker = "platform_machine != 'aarch64' and sys_platform == 'linux'" },
2114
+ { name = "nvidia-nvjitlink-cu12", marker = "platform_machine != 'aarch64' and sys_platform == 'linux'" },
2115
  ]
2116
  wheels = [
2117
  { url = "https://files.pythonhosted.org/packages/bc/1d/8de1e5c67099015c834315e333911273a8c6aaba78923dd1d1e25fc5f217/nvidia_cusolver_cu12-11.4.5.107-py3-none-manylinux1_x86_64.whl", hash = "sha256:8a7ec542f0412294b15072fa7dab71d31334014a69f953004ea7a118206fe0dd", size = 124161928, upload-time = "2023-04-19T15:51:25.781Z" },
 
2122
  version = "12.1.0.106"
2123
  source = { registry = "https://pypi.org/simple" }
2124
  dependencies = [
2125
+ { name = "nvidia-nvjitlink-cu12", marker = "platform_machine != 'aarch64' and sys_platform == 'linux'" },
2126
  ]
2127
  wheels = [
2128
  { url = "https://files.pythonhosted.org/packages/65/5b/cfaeebf25cd9fdec14338ccb16f6b2c4c7fa9163aefcf057d86b9cc248bb/nvidia_cusparse_cu12-12.1.0.106-py3-none-manylinux1_x86_64.whl", hash = "sha256:f3b50f42cf363f86ab21f720998517a659a48131e8d538dc02f8768237bd884c", size = 195958278, upload-time = "2023-04-19T15:51:49.939Z" },
 
3833
  version = "3.1.0"
3834
  source = { registry = "https://pypi.org/simple" }
3835
  dependencies = [
3836
+ { name = "filelock", marker = "platform_machine != 'aarch64' and sys_platform == 'linux'" },
3837
  ]
3838
  wheels = [
3839
  { url = "https://files.pythonhosted.org/packages/98/29/69aa56dc0b2eb2602b553881e34243475ea2afd9699be042316842788ff5/triton-3.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b0dd10a925263abbe9fa37dcde67a5e9b2383fc269fdf59f5657cac38c5d1d8", size = 209460013, upload-time = "2024-10-14T16:05:32.106Z" },