Skip to content

Commit f8d17e0

Browse files
authored
Merge pull request #63 from stackhpc/feat/flux-image-gen
Add new flux image generator chart
2 parents 701ad09 + 2f4cffe commit f8d17e0

26 files changed

+1027
-8
lines changed

.github/workflows/build-push-images.yml

+1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ jobs:
1818
include:
1919
- component: chat
2020
- component: image-analysis
21+
- component: flux-image-gen
2122
permissions:
2223
contents: read
2324
id-token: write # needed for signing the images with GitHub OIDC Token

.gitignore

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ __pycache__/
88
**/.ruff_cache
99

1010
# Ignore local dev helpers
11-
test-values.y[a]ml
11+
**/dev-values.yml
1212
**venv*/
1313

1414
# Helm chart stuff

charts/flux-image-gen/.helmignore

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# Patterns to ignore when building packages.
2+
# This supports shell glob matching, relative path matching, and
3+
# negation (prefixed with !). Only one pattern per line.
4+
.DS_Store
5+
# Common VCS dirs
6+
.git/
7+
.gitignore
8+
.bzr/
9+
.bzrignore
10+
.hg/
11+
.hgignore
12+
.svn/
13+
# Common backup files
14+
*.swp
15+
*.bak
16+
*.tmp
17+
*.orig
18+
*~
19+
# Various IDEs
20+
.project
21+
.idea/
22+
*.tmproj
23+
.vscode/

charts/flux-image-gen/Chart.yaml

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
apiVersion: v2
2+
name: flux-image-gen
3+
description: A Helm chart for running Flux image generation models on Kubernetes
4+
5+
type: application
6+
7+
# The version and appVersion are updated by the chart build script
8+
version: 0.1.0
9+
appVersion: local
+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
models:
2+
- flux-dev
3+
- flux-schnell
4+
api:
5+
# Run in dev mode so that we skip
6+
# the image gen step and can therefore
7+
# test in a kind cluster
8+
commandOverride:
9+
- fastapi
10+
- dev
11+
- api_server.py
12+
- --host
13+
- "0.0.0.0"

charts/flux-image-gen/templates/NOTES.txt

Whitespace-only changes.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
{{/*
2+
Expand the name of the chart.
3+
*/}}
4+
{{- define "flux-image-gen.name" -}}
5+
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }}
6+
{{- end }}
7+
8+
{{/*
9+
Create a default fully qualified app name.
10+
We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
11+
If release name contains chart name it will be used as a full name.
12+
*/}}
13+
{{- define "flux-image-gen.fullname" -}}
14+
{{- if .Values.fullnameOverride }}
15+
{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }}
16+
{{- else }}
17+
{{- $name := default .Chart.Name .Values.nameOverride }}
18+
{{- if contains $name .Release.Name }}
19+
{{- .Release.Name | trunc 63 | trimSuffix "-" }}
20+
{{- else }}
21+
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }}
22+
{{- end }}
23+
{{- end }}
24+
{{- end }}
25+
26+
{{/*
27+
Create chart name and version as used by the chart label.
28+
*/}}
29+
{{- define "flux-image-gen.chart" -}}
30+
{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }}
31+
{{- end }}
32+
33+
{{/*
34+
Common labels
35+
*/}}
36+
{{- define "flux-image-gen.labels" -}}
37+
helm.sh/chart: {{ include "flux-image-gen.chart" . }}
38+
{{ include "flux-image-gen.selectorLabels" . }}
39+
{{- if .Chart.AppVersion }}
40+
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
41+
{{- end }}
42+
app.kubernetes.io/managed-by: {{ .Release.Service }}
43+
{{- end }}
44+
45+
{{/*
46+
Selector labels
47+
*/}}
48+
{{- define "flux-image-gen.selectorLabels" -}}
49+
app.kubernetes.io/name: {{ include "flux-image-gen.name" . }}
50+
app.kubernetes.io/instance: {{ .Release.Name }}
51+
{{- end }}
52+
53+
{{/*
54+
Model selector labels
55+
*/}}
56+
{{- define "flux-image-gen.modelLabels" -}}
57+
app.kubernetes.io/component: {{ . }}-api
58+
{{- end }}
59+
60+
{{/*
61+
UI selector labels
62+
*/}}
63+
{{- define "flux-image-gen.uiLabels" -}}
64+
app.kubernetes.io/component: {{ .Release.Name }}-ui
65+
{{- end }}
66+
67+
68+
{{/*
69+
Create the name of the service account to use
70+
*/}}
71+
{{- define "flux-image-gen.serviceAccountName" -}}
72+
{{- if .Values.serviceAccount.create }}
73+
{{- default (include "flux-image-gen.fullname" .) .Values.serviceAccount.name }}
74+
{{- else }}
75+
{{- default "default" .Values.serviceAccount.name }}
76+
{{- end }}
77+
{{- end }}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
{{- range $model := .Values.models }}
2+
---
3+
apiVersion: apps/v1
4+
kind: Deployment
5+
metadata:
6+
name: {{ printf "%s-%s-api" (include "flux-image-gen.fullname" $) $model }}
7+
labels:
8+
{{- include "flux-image-gen.labels" $ | nindent 4 }}
9+
{{- include "flux-image-gen.modelLabels" . | nindent 4 }}
10+
spec:
11+
replicas: {{ $.Values.api.replicaCount }}
12+
{{- with $.Values.api.deploymentStrategy }}
13+
strategy:
14+
{{- toYaml . | nindent 4 }}
15+
{{- end }}
16+
selector:
17+
matchLabels:
18+
{{- include "flux-image-gen.selectorLabels" $ | nindent 6 }}
19+
{{- include "flux-image-gen.modelLabels" . | nindent 6 }}
20+
template:
21+
metadata:
22+
{{- with $.Values.api.podAnnotations }}
23+
annotations:
24+
{{- toYaml . | nindent 8 }}
25+
{{- end }}
26+
labels:
27+
{{- include "flux-image-gen.labels" $ | nindent 8 }}
28+
{{- include "flux-image-gen.modelLabels" . | nindent 8 }}
29+
{{- with $.Values.api.podLabels }}
30+
{{- toYaml . | nindent 8 }}
31+
{{- end }}
32+
spec:
33+
{{- with $.Values.api.imagePullSecrets }}
34+
imagePullSecrets:
35+
{{- toYaml . | nindent 8 }}
36+
{{- end }}
37+
securityContext:
38+
{{- toYaml $.Values.api.podSecurityContext | nindent 8 }}
39+
containers:
40+
- name: {{ $.Chart.Name }}
41+
securityContext:
42+
{{- toYaml $.Values.api.securityContext | nindent 12 }}
43+
image: "{{ $.Values.image.repository }}:{{ $.Values.image.tag | default $.Chart.AppVersion }}"
44+
imagePullPolicy: {{ $.Values.image.pullPolicy }}
45+
{{- with $.Values.api.commandOverride }}
46+
{{- if . }}
47+
command:
48+
{{- . | toYaml | nindent 12 }}
49+
{{- end }}
50+
{{- end }}
51+
ports:
52+
- name: http
53+
containerPort: {{ $.Values.api.service.port }}
54+
protocol: TCP
55+
{{- if $.Values.api.startupProbe }}
56+
startupProbe:
57+
{{- toYaml $.Values.api.startupProbe | nindent 12 }}
58+
{{- end }}
59+
{{- if $.Values.api.livenessProbe }}
60+
livenessProbe:
61+
{{- toYaml $.Values.api.livenessProbe | nindent 12 }}
62+
{{- end }}
63+
{{- if $.Values.api.readinessProbe }}
64+
readinessProbe:
65+
{{- toYaml $.Values.api.readinessProbe | nindent 12 }}
66+
{{- end }}
67+
resources:
68+
{{- toYaml $.Values.api.resources | nindent 12 }}
69+
{{- with $.Values.api.volumeMounts }}
70+
volumeMounts:
71+
{{- toYaml . | nindent 12 }}
72+
{{- end }}
73+
# Make stdout from python visible in k8s logs
74+
tty: true
75+
env:
76+
- name: FLUX_MODEL_NAME
77+
value: {{ $model }}
78+
- name: PYTHONUNBUFFERED
79+
value: "1"
80+
{{- if $.Values.api.huggingfaceToken }}
81+
- name: HUGGING_FACE_HUB_TOKEN
82+
value: {{ quote $.Values.api.huggingfaceToken }}
83+
{{- end }}
84+
{{- with $.Values.api.envFrom }}
85+
envFrom:
86+
{{- toYaml . | nindent 12 }}
87+
{{- end }}
88+
{{- with $.Values.api.volumes }}
89+
volumes:
90+
{{- toYaml . | nindent 8 }}
91+
{{- end }}
92+
{{- with $.Values.api.nodeSelector }}
93+
nodeSelector:
94+
{{- toYaml . | nindent 8 }}
95+
{{- end }}
96+
{{- with $.Values.api.affinity }}
97+
affinity:
98+
{{- toYaml . | nindent 8 }}
99+
{{- end }}
100+
{{- with $.Values.api.tolerations }}
101+
tolerations:
102+
{{- toYaml . | nindent 8 }}
103+
{{- end }}
104+
{{- end -}}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
{{- range $model := .Values.models }}
2+
---
3+
apiVersion: v1
4+
kind: Service
5+
metadata:
6+
name: {{ printf "%s-%s-api" (include "flux-image-gen.fullname" $) $model }}
7+
labels:
8+
{{- include "flux-image-gen.labels" $ | nindent 4 }}
9+
{{- include "flux-image-gen.modelLabels" . | nindent 4 }}
10+
spec:
11+
type: {{ $.Values.api.service.type }}
12+
ports:
13+
- port: {{ $.Values.api.service.port }}
14+
targetPort: http
15+
protocol: TCP
16+
name: http
17+
selector:
18+
{{- include "flux-image-gen.selectorLabels" $ | nindent 4 }}
19+
{{- include "flux-image-gen.modelLabels" . | nindent 4 }}
20+
{{- end -}}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
apiVersion: batch/v1
2+
kind: Job
3+
metadata:
4+
name: gradio-client-test
5+
annotations:
6+
"helm.sh/hook": test
7+
spec:
8+
template:
9+
spec:
10+
containers:
11+
- name: gradio-client
12+
image: "{{ $.Values.image.repository }}:{{ $.Values.image.tag | default $.Chart.AppVersion }}"
13+
command:
14+
- python
15+
- test_client.py
16+
env:
17+
- name: GRADIO_HOST
18+
value: {{ printf "http://%s-ui.%s.svc:%v" (include "flux-image-gen.fullname" .) .Release.Namespace .Values.ui.service.port }}
19+
- name: FLUX_MODEL
20+
value: {{ .Values.models | first }}
21+
restartPolicy: Never
22+
backoffLimit: 3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
---
2+
apiVersion: v1
3+
kind: ConfigMap
4+
metadata:
5+
name: {{ .Release.Name }}-ui-config
6+
labels:
7+
{{- include "flux-image-gen.labels" . | nindent 4 }}
8+
data:
9+
gradio_config.yaml: |
10+
models:
11+
{{- range $model := .Values.models }}
12+
- name: {{ . }}
13+
address: {{ printf "http://%s.%s.svc:%v" ( printf "%s-%s-api" (include "flux-image-gen.fullname" $) . ) $.Release.Namespace $.Values.api.service.port }}
14+
{{- end }}
15+
example_prompt: |
16+
{{- .Values.examplePrompt | nindent 6 -}}

0 commit comments

Comments
 (0)