@@ -32,7 +32,7 @@ func Aikit2LLB(c *config.Config) (llb.State, *specs.Image) {
32
32
33
33
// install cuda if runtime is nvidia
34
34
if c .Runtime == utils .RuntimeNVIDIA {
35
- merge = installCuda (c , state , merge )
35
+ state , merge = installCuda (c , state , merge )
36
36
}
37
37
38
38
// install opencv and friends if stable diffusion backend is being used
@@ -43,6 +43,8 @@ func Aikit2LLB(c *config.Config) (llb.State, *specs.Image) {
43
43
merge = installExllama (c , state , merge )
44
44
case utils .BackendStableDiffusion :
45
45
merge = installOpenCV (state , merge )
46
+ case utils .BackendMamba :
47
+ merge = installMamba (state , merge )
46
48
}
47
49
}
48
50
@@ -51,26 +53,14 @@ func Aikit2LLB(c *config.Config) (llb.State, *specs.Image) {
51
53
}
52
54
53
55
func getBaseImage (c * config.Config ) llb.State {
54
- for b := range c .Backends {
55
- switch c .Backends [b ] {
56
- case utils .BackendExllama :
57
- case utils .BackendExllamaV2 :
58
- return llb .Image (debianSlim )
59
- case utils .BackendStableDiffusion :
60
- return llb .Image (debianSlim )
61
- }
56
+ if len (c .Backends ) > 0 {
57
+ return llb .Image (debianSlim )
62
58
}
63
59
return llb .Image (distrolessBase )
64
60
}
65
61
66
62
func copyModels (c * config.Config , base llb.State , s llb.State ) (llb.State , llb.State ) {
67
63
savedState := s
68
-
69
- // create config file if defined
70
- if c .Config != "" {
71
- s = s .Run (shf ("echo -n \" %s\" > /config.yaml" , c .Config )).Root ()
72
- }
73
-
74
64
for _ , model := range c .Models {
75
65
var opts []llb.HTTPOption
76
66
opts = append (opts , llb .Filename (fileNameFromURL (model .Source )))
@@ -104,6 +94,12 @@ func copyModels(c *config.Config, base llb.State, s llb.State) (llb.State, llb.S
104
94
}
105
95
}
106
96
}
97
+
98
+ // create config file if defined
99
+ if c .Config != "" {
100
+ s = s .Run (shf ("echo -n \" %s\" > /config.yaml" , c .Config )).Root ()
101
+ }
102
+
107
103
diff := llb .Diff (savedState , s )
108
104
merge := llb .Merge ([]llb.State {base , diff })
109
105
return s , merge
@@ -117,18 +113,19 @@ func fileNameFromURL(urlString string) string {
117
113
return path .Base (parsedURL .Path )
118
114
}
119
115
120
- func installCuda (c * config.Config , s llb.State , merge llb.State ) llb.State {
116
+ func installCuda (c * config.Config , s llb.State , merge llb.State ) ( llb.State , llb. State ) {
121
117
cudaKeyringURL := "https://developer.download.nvidia.com/compute/cuda/repos/debian12/x86_64/cuda-keyring_1.1-1_all.deb"
122
118
cudaKeyring := llb .HTTP (cudaKeyringURL )
123
119
s = s .File (
124
120
llb .Copy (cudaKeyring , fileNameFromURL (cudaKeyringURL ), "/" ),
125
121
llb .WithCustomName ("Copying " + fileNameFromURL (cudaKeyringURL )), //nolint: goconst
126
122
)
127
123
s = s .Run (sh ("dpkg -i cuda-keyring_1.1-1_all.deb && rm cuda-keyring_1.1-1_all.deb" )).Root ()
124
+
125
+ savedState := s
128
126
// running apt-get update twice due to nvidia repo
129
127
s = s .Run (sh ("apt-get update && apt-get install -y ca-certificates && apt-get update" ), llb .IgnoreCache ).Root ()
130
128
131
- savedState := s
132
129
// install cuda libraries
133
130
if len (c .Backends ) == 0 {
134
131
s = s .Run (shf ("apt-get install -y --no-install-recommends libcublas-%[1]s cuda-cudart-%[1]s && apt-get clean" , cudaVersion )).Root ()
@@ -149,20 +146,25 @@ func installCuda(c *config.Config, s llb.State, merge llb.State) llb.State {
149
146
150
147
s = s .Run (sh (exllamaDeps )).Root ()
151
148
}
149
+
150
+ if c .Backends [b ] == utils .BackendMamba {
151
+ mambaDeps := fmt .Sprintf ("apt-get install -y --no-install-recommends cuda-crt-%[1]s cuda-cudart-dev-%[1]s cuda-nvcc-%[1]s && apt-get clean" , cudaVersion )
152
+ s = s .Run (sh (mambaDeps )).Root ()
153
+ }
152
154
}
153
155
154
156
diff := llb .Diff (savedState , s )
155
- return llb .Merge ([]llb.State {merge , diff })
157
+ return s , llb .Merge ([]llb.State {merge , diff })
156
158
}
157
159
158
160
func installExllama (c * config.Config , s llb.State , merge llb.State ) llb.State {
159
- backend := "exllama"
161
+ backend := utils . BackendExllama
160
162
exllamaRepo := "https://github.com/turboderp/exllama"
161
163
exllamaTag := "master"
162
164
for b := range c .Backends {
163
165
if c .Backends [b ] == utils .BackendExllamaV2 {
164
166
exllamaRepo = "https://github.com/turboderp/exllamav2"
165
- backend = "exllama2"
167
+ backend = utils . BackendExllamaV2
166
168
exllamaTag = "v0.0.11"
167
169
}
168
170
}
@@ -171,7 +173,7 @@ func installExllama(c *config.Config, s llb.State, merge llb.State) llb.State {
171
173
s = s .Run (sh ("apt-get update && apt-get install --no-install-recommends -y git ca-certificates python3-pip python3-dev g++ && apt-get clean" ), llb .IgnoreCache ).Root ()
172
174
173
175
// clone localai exllama backend only
174
- s = s . Run ( shf ( "git clone --filter=blob:none --no-checkout %[1]s /tmp/localai/ && cd /tmp/localai && git sparse-checkout init --cone && git sparse-checkout set backend/python/%[2]s && git checkout %[3]s && rm -rf .git" , localAIRepo , backend , localAIVersion )). Root ( )
176
+ s = cloneLocalAI ( s , backend )
175
177
176
178
// clone exllama to localai exllama backend path and install python dependencies
177
179
s = s .Run (shf ("git clone --depth 1 %[1]s --branch %[2]s /tmp/%[3]s && mv /tmp/%[3]s/* /tmp/localai/backend/python/%[3]s && rm -rf /tmp/%[3]s && cd /tmp/localai/backend/python/%[3]s && rm -rf .git && pip3 install grpcio protobuf typing-extensions sympy mpmath setuptools numpy --break-system-packages && pip3 install -r /tmp/localai/backend/python/%[3]s/requirements.txt --break-system-packages" , exllamaRepo , exllamaTag , backend )).Root ()
@@ -180,6 +182,19 @@ func installExllama(c *config.Config, s llb.State, merge llb.State) llb.State {
180
182
return llb .Merge ([]llb.State {merge , diff })
181
183
}
182
184
185
+ func installMamba (s llb.State , merge llb.State ) llb.State {
186
+ savedState := s
187
+ // libexpat1 is requirement but git is not. however libexpat1 is a dependency of git
188
+ s = s .Run (sh ("apt-get install --no-install-recommends -y git python3 python3-dev python3-pip libssl3 openssl && apt-get clean" ), llb .IgnoreCache ).Root ()
189
+
190
+ s = cloneLocalAI (s , utils .BackendMamba )
191
+
192
+ s = s .Run (shf ("pip3 install packaging numpy torch==2.1.0 grpcio protobuf --break-system-packages && pip3 install causal-conv1d==1.0.0 mamba-ssm==1.0.1 --break-system-packages" )).Root ()
193
+
194
+ diff := llb .Diff (savedState , s )
195
+ return llb .Merge ([]llb.State {merge , diff })
196
+ }
197
+
183
198
func installOpenCV (s llb.State , merge llb.State ) llb.State {
184
199
savedState := s
185
200
// adding debian 11 (bullseye) repo due to opencv 4.5 requirement
@@ -233,6 +248,10 @@ func addLocalAI(c *config.Config, s llb.State, merge llb.State) (llb.State, llb.
233
248
return s , llb .Merge ([]llb.State {merge , diff })
234
249
}
235
250
251
+ func cloneLocalAI (s llb.State , backend string ) llb.State {
252
+ return s .Run (shf ("git clone --filter=blob:none --no-checkout %[1]s /tmp/localai/ && cd /tmp/localai && git sparse-checkout init --cone && git sparse-checkout set backend/python/%[2]s && git checkout %[3]s && rm -rf .git" , localAIRepo , backend , localAIVersion )).Root ()
253
+ }
254
+
236
255
func shf (cmd string , v ... interface {}) llb.RunOption {
237
256
return llb .Args ([]string {"/bin/sh" , "-c" , fmt .Sprintf (cmd , v ... )})
238
257
}
0 commit comments