mirror of
https://github.com/mudler/LocalAI.git
synced 2026-05-24 08:38:02 -04:00
Compare commits
309 Commits
v2.22.1
...
propagate_
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
894a30296a | ||
|
|
c85f46a71d | ||
|
|
75b283d83c | ||
|
|
1918efdfdd | ||
|
|
ec239a0cd0 | ||
|
|
b74a936178 | ||
|
|
de1ddb8ba6 | ||
|
|
272763f625 | ||
|
|
3aff87a5cf | ||
|
|
885118e863 | ||
|
|
a03a9b9e51 | ||
|
|
f45d6c746a | ||
|
|
5eceb5f67c | ||
|
|
a9c0dd3a1e | ||
|
|
fb17e737f0 | ||
|
|
b5a21202ed | ||
|
|
e147f1bd3e | ||
|
|
61839efed2 | ||
|
|
a0fe050055 | ||
|
|
f943c4b803 | ||
|
|
cea5a0ea42 | ||
|
|
f5e1527a5a | ||
|
|
7184ca546f | ||
|
|
5592f5e820 | ||
|
|
d4c1746c7d | ||
|
|
88737e1d76 | ||
|
|
ba225f660b | ||
|
|
3127cd1352 | ||
|
|
b90d78d9f6 | ||
|
|
b86a3e4fa6 | ||
|
|
be907d993f | ||
|
|
ab0f8648a3 | ||
|
|
c226149503 | ||
|
|
4a079f893c | ||
|
|
87b7648591 | ||
|
|
cf4f024420 | ||
|
|
3c0ac49d90 | ||
|
|
4307ae5d52 | ||
|
|
50f71f73d7 | ||
|
|
dc04a43868 | ||
|
|
cc04b62d3a | ||
|
|
feb54e65c2 | ||
|
|
44a5dac312 | ||
|
|
074b52bbfe | ||
|
|
236a60bab8 | ||
|
|
7b70f0543b | ||
|
|
5f33962932 | ||
|
|
45b91d501e | ||
|
|
e51792784a | ||
|
|
28594336e9 | ||
|
|
9c9359fc96 | ||
|
|
bc5d1f255b | ||
|
|
0fcefbc168 | ||
|
|
9044b17e4d | ||
|
|
ad31daf03b | ||
|
|
1167487f5e | ||
|
|
61358e4d35 | ||
|
|
2c8a87b1e4 | ||
|
|
55aad5f525 | ||
|
|
58ff47de26 | ||
|
|
0d6c3a7d57 | ||
|
|
e001fada6c | ||
|
|
f4547fcf8a | ||
|
|
7b75e9de2d | ||
|
|
cbedf2f428 | ||
|
|
0597f3b9e9 | ||
|
|
5f688d7a8d | ||
|
|
fa20628b3a | ||
|
|
13bf048cfc | ||
|
|
bdd6920910 | ||
|
|
3c3050f68e | ||
|
|
1688ba7f2a | ||
|
|
e8128a339a | ||
|
|
369110e6bf | ||
|
|
2b62260b6d | ||
|
|
03800ccceb | ||
|
|
f1b86d6e7f | ||
|
|
404ca3cc23 | ||
|
|
7492179c67 | ||
|
|
eeb22317b5 | ||
|
|
9b46dcf006 | ||
|
|
6c8e870812 | ||
|
|
0f8f249465 | ||
|
|
720ffc1d9d | ||
|
|
5c4e4c1cbc | ||
|
|
32ca4a51e5 | ||
|
|
dbe98229e8 | ||
|
|
1de20331ca | ||
|
|
7d2f213dc8 | ||
|
|
76c8d0b868 | ||
|
|
aae7e5fe99 | ||
|
|
9cb30bedeb | ||
|
|
f1a72f3a16 | ||
|
|
a04cf9543d | ||
|
|
7a973c8c16 | ||
|
|
66b06f43af | ||
|
|
74134ef99a | ||
|
|
f5fdef72e3 | ||
|
|
cfc45dff37 | ||
|
|
30f641fe12 | ||
|
|
76f5ba1412 | ||
|
|
b601535cdd | ||
|
|
c9c58a24a8 | ||
|
|
4e3df95737 | ||
|
|
f028ee8a26 | ||
|
|
47dc4337ba | ||
|
|
fa6fcdf53e | ||
|
|
163ca74590 | ||
|
|
961a993b88 | ||
|
|
46847f3bd4 | ||
|
|
f03bbf3188 | ||
|
|
73ab921391 | ||
|
|
eaf0e3022a | ||
|
|
7adbc16bae | ||
|
|
76d813ed1c | ||
|
|
4f1ab2366d | ||
|
|
51e0db367a | ||
|
|
c20e145aa5 | ||
|
|
b1ea9318e6 | ||
|
|
9892d7d584 | ||
|
|
96377feff6 | ||
|
|
eeeedaf5c6 | ||
|
|
de148cb2ad | ||
|
|
8a4df3af99 | ||
|
|
cfb0ac3992 | ||
|
|
57de92e727 | ||
|
|
ccf64cd7e2 | ||
|
|
47c4248703 | ||
|
|
faf203eeb3 | ||
|
|
534cdf1306 | ||
|
|
569171ae97 | ||
|
|
b10c4ad90f | ||
|
|
a7db97e033 | ||
|
|
e0acc149fe | ||
|
|
61e14ad10b | ||
|
|
a028d97888 | ||
|
|
e898e0bdc2 | ||
|
|
8b0b326875 | ||
|
|
57e793482a | ||
|
|
9b1d53f109 | ||
|
|
f6adcd49fb | ||
|
|
65bcc01a34 | ||
|
|
3200090901 | ||
|
|
6516c093cb | ||
|
|
f69afb457c | ||
|
|
c53c0b068b | ||
|
|
939fbe59cc | ||
|
|
62d0d004fa | ||
|
|
de2b5748c3 | ||
|
|
065215341f | ||
|
|
1770b92fb6 | ||
|
|
a73c660fee | ||
|
|
b7d757186c | ||
|
|
1ef379854e | ||
|
|
216838b5da | ||
|
|
6ce0c0e4df | ||
|
|
8ab7517294 | ||
|
|
8a89aafc8c | ||
|
|
c222b2b7c0 | ||
|
|
5b166df96a | ||
|
|
489cb90322 | ||
|
|
c1d76290dc | ||
|
|
668ec2fadc | ||
|
|
ee4f1210bb | ||
|
|
aebaf71be6 | ||
|
|
1db504353c | ||
|
|
b36ced8681 | ||
|
|
5de277cc78 | ||
|
|
daf1b25476 | ||
|
|
e76bdaf61b | ||
|
|
f3aeec6a4d | ||
|
|
4e2a5719e7 | ||
|
|
fe7ffdbc63 | ||
|
|
8079ffee25 | ||
|
|
9688f516e0 | ||
|
|
7903e1f6fa | ||
|
|
1ec64bf683 | ||
|
|
2daf638ef8 | ||
|
|
bc25890a65 | ||
|
|
066fcce57b | ||
|
|
94fe07d073 | ||
|
|
8252a66034 | ||
|
|
5ab0ae9de5 | ||
|
|
7e2ef630aa | ||
|
|
e7d3efec14 | ||
|
|
4f5ec946ac | ||
|
|
9099d0c77e | ||
|
|
b69614c2b3 | ||
|
|
068b90a6dc | ||
|
|
0586fe2d9c | ||
|
|
f1e03bf474 | ||
|
|
7f0093b2c9 | ||
|
|
e8431d62a2 | ||
|
|
adafd7cf23 | ||
|
|
6daef00d30 | ||
|
|
a0cdd19038 | ||
|
|
d454118887 | ||
|
|
356f23bacb | ||
|
|
196c249367 | ||
|
|
e2a8dd64db | ||
|
|
20a5b20b59 | ||
|
|
06d0d00231 | ||
|
|
62c7f745ca | ||
|
|
551faa8ddb | ||
|
|
2c041a2077 | ||
|
|
c4af769d4f | ||
|
|
b425a870b0 | ||
|
|
b59e16742e | ||
|
|
947224b952 | ||
|
|
20cd8814c1 | ||
|
|
ce8045f521 | ||
|
|
1bf5a11437 | ||
|
|
2daa5e6be0 | ||
|
|
b91aa288b5 | ||
|
|
43187d1aba | ||
|
|
97b730e238 | ||
|
|
d11ed5287b | ||
|
|
81ac490202 | ||
|
|
e53dd4a57b | ||
|
|
d274df2fe2 | ||
|
|
0b3a55b9fe | ||
|
|
abd5eea66d | ||
|
|
65c3df392c | ||
|
|
57908df956 | ||
|
|
26e522a558 | ||
|
|
817685e4c1 | ||
|
|
bcad3f3018 | ||
|
|
303370ad87 | ||
|
|
a9fb7174ba | ||
|
|
6d6f50340f | ||
|
|
6a136b2a4b | ||
|
|
8f7045cfa6 | ||
|
|
61c964dce7 | ||
|
|
48d621c64e | ||
|
|
661dbbf2b4 | ||
|
|
254f644c5f | ||
|
|
88edb1e2af | ||
|
|
640a3f1bfe | ||
|
|
b1243453f4 | ||
|
|
dfc651f643 | ||
|
|
d4978383ff | ||
|
|
cde0139363 | ||
|
|
3d4bb757d2 | ||
|
|
a4e749c22f | ||
|
|
25a9685e2f | ||
|
|
94d417c2b7 | ||
|
|
b897d47e0f | ||
|
|
3422d21346 | ||
|
|
a7917a2150 | ||
|
|
7b23b894b4 | ||
|
|
15c083f731 | ||
|
|
293eaad69d | ||
|
|
605126db8a | ||
|
|
3980beabd7 | ||
|
|
11d3ce9edb | ||
|
|
14cb620cd8 | ||
|
|
841dfefd62 | ||
|
|
d1cb2467fd | ||
|
|
a8e10f03e9 | ||
|
|
94010a0a44 | ||
|
|
75bc933dc4 | ||
|
|
8de0f21f7c | ||
|
|
66b03b54cb | ||
|
|
9ea8159683 | ||
|
|
c33083aeca | ||
|
|
eb34f838f8 | ||
|
|
8327e85e34 | ||
|
|
a8c08d83d0 | ||
|
|
e314cdcdde | ||
|
|
4528e969c9 | ||
|
|
175ae751ba | ||
|
|
43bfdc9561 | ||
|
|
546dce68a6 | ||
|
|
82db2fa425 | ||
|
|
a27af2d7ad | ||
|
|
9f43f37150 | ||
|
|
3ad920b50a | ||
|
|
dbe7ac484c | ||
|
|
d9905ba050 | ||
|
|
dd2e243997 | ||
|
|
fd905b483b | ||
|
|
9c5cd9b38b | ||
|
|
07ce0a3c17 | ||
|
|
5be2d22117 | ||
|
|
e88468640f | ||
|
|
81890e76a0 | ||
|
|
a91c2e7aaa | ||
|
|
7748eb6553 | ||
|
|
835932e95e | ||
|
|
ae1ec4e096 | ||
|
|
c75ecfa009 | ||
|
|
8737a65760 | ||
|
|
418c582430 | ||
|
|
6fd0341eca | ||
|
|
ccc7cb0287 | ||
|
|
a1d6cc93a8 | ||
|
|
dc14d80f51 | ||
|
|
b8eb10b6b7 | ||
|
|
0f6b4513bf | ||
|
|
6f0c936f74 | ||
|
|
42136b6f27 | ||
|
|
2810e3ea5c | ||
|
|
11d34e38dc | ||
|
|
06951cdd6b | ||
|
|
103af480c7 | ||
|
|
db401b4d84 | ||
|
|
e0c876aae1 | ||
|
|
5e0847b3d7 | ||
|
|
ee5ca49bc1 |
11
.bruno/LocalAI Test Requests/model gallery/model delete.bru
Normal file
11
.bruno/LocalAI Test Requests/model gallery/model delete.bru
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
meta {
|
||||||
|
name: model delete
|
||||||
|
type: http
|
||||||
|
seq: 7
|
||||||
|
}
|
||||||
|
|
||||||
|
post {
|
||||||
|
url: {{PROTOCOL}}{{HOST}}:{{PORT}}/models/galleries
|
||||||
|
body: none
|
||||||
|
auth: none
|
||||||
|
}
|
||||||
BIN
.bruno/LocalAI Test Requests/transcription/gb1.ogg
Normal file
BIN
.bruno/LocalAI Test Requests/transcription/gb1.ogg
Normal file
Binary file not shown.
16
.bruno/LocalAI Test Requests/transcription/transcribe.bru
Normal file
16
.bruno/LocalAI Test Requests/transcription/transcribe.bru
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
meta {
|
||||||
|
name: transcribe
|
||||||
|
type: http
|
||||||
|
seq: 1
|
||||||
|
}
|
||||||
|
|
||||||
|
post {
|
||||||
|
url: {{PROTOCOL}}{{HOST}}:{{PORT}}/v1/audio/transcriptions
|
||||||
|
body: multipartForm
|
||||||
|
auth: none
|
||||||
|
}
|
||||||
|
|
||||||
|
body:multipart-form {
|
||||||
|
file: @file(transcription/gb1.ogg)
|
||||||
|
model: whisper-1
|
||||||
|
}
|
||||||
1
.gitattributes
vendored
1
.gitattributes
vendored
@@ -1 +1,2 @@
|
|||||||
*.sh text eol=lf
|
*.sh text eol=lf
|
||||||
|
backend/cpp/llama/*.hpp linguist-vendored
|
||||||
5
.github/labeler.yml
vendored
5
.github/labeler.yml
vendored
@@ -1,6 +1,11 @@
|
|||||||
enhancements:
|
enhancements:
|
||||||
- head-branch: ['^feature', 'feature']
|
- head-branch: ['^feature', 'feature']
|
||||||
|
|
||||||
|
dependencies:
|
||||||
|
- any:
|
||||||
|
- changed-files:
|
||||||
|
- any-glob-to-any-file: 'Makefile'
|
||||||
|
|
||||||
kind/documentation:
|
kind/documentation:
|
||||||
- any:
|
- any:
|
||||||
- changed-files:
|
- changed-files:
|
||||||
|
|||||||
17
.github/workflows/bump_deps.yaml
vendored
17
.github/workflows/bump_deps.yaml
vendored
@@ -12,23 +12,14 @@ jobs:
|
|||||||
- repository: "ggerganov/llama.cpp"
|
- repository: "ggerganov/llama.cpp"
|
||||||
variable: "CPPLLAMA_VERSION"
|
variable: "CPPLLAMA_VERSION"
|
||||||
branch: "master"
|
branch: "master"
|
||||||
- repository: "go-skynet/go-ggml-transformers.cpp"
|
|
||||||
variable: "GOGGMLTRANSFORMERS_VERSION"
|
|
||||||
branch: "master"
|
|
||||||
- repository: "donomii/go-rwkv.cpp"
|
|
||||||
variable: "RWKV_VERSION"
|
|
||||||
branch: "main"
|
|
||||||
- repository: "ggerganov/whisper.cpp"
|
- repository: "ggerganov/whisper.cpp"
|
||||||
variable: "WHISPER_CPP_VERSION"
|
variable: "WHISPER_CPP_VERSION"
|
||||||
branch: "master"
|
branch: "master"
|
||||||
- repository: "go-skynet/go-bert.cpp"
|
- repository: "PABannier/bark.cpp"
|
||||||
variable: "BERT_VERSION"
|
variable: "BARKCPP_VERSION"
|
||||||
branch: "master"
|
|
||||||
- repository: "go-skynet/bloomz.cpp"
|
|
||||||
variable: "BLOOMZ_VERSION"
|
|
||||||
branch: "main"
|
branch: "main"
|
||||||
- repository: "mudler/go-ggllm.cpp"
|
- repository: "leejet/stable-diffusion.cpp"
|
||||||
variable: "GOGGLLM_VERSION"
|
variable: "STABLEDIFFUSION_GGML_VERSION"
|
||||||
branch: "master"
|
branch: "master"
|
||||||
- repository: "mudler/go-stable-diffusion"
|
- repository: "mudler/go-stable-diffusion"
|
||||||
variable: "STABLEDIFFUSION_VERSION"
|
variable: "STABLEDIFFUSION_VERSION"
|
||||||
|
|||||||
2
.github/workflows/checksum_checker.yaml
vendored
2
.github/workflows/checksum_checker.yaml
vendored
@@ -23,7 +23,7 @@ jobs:
|
|||||||
sudo pip install --upgrade pip
|
sudo pip install --upgrade pip
|
||||||
pip install huggingface_hub
|
pip install huggingface_hub
|
||||||
- name: 'Setup yq'
|
- name: 'Setup yq'
|
||||||
uses: dcarbone/install-yq-action@v1.1.1
|
uses: dcarbone/install-yq-action@v1.3.1
|
||||||
with:
|
with:
|
||||||
version: 'v4.44.2'
|
version: 'v4.44.2'
|
||||||
download-compressed: true
|
download-compressed: true
|
||||||
|
|||||||
4
.github/workflows/deploy-explorer.yaml
vendored
4
.github/workflows/deploy-explorer.yaml
vendored
@@ -33,7 +33,7 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
CGO_ENABLED=0 make build-api
|
CGO_ENABLED=0 make build-api
|
||||||
- name: rm
|
- name: rm
|
||||||
uses: appleboy/ssh-action@v1.1.0
|
uses: appleboy/ssh-action@v1.2.0
|
||||||
with:
|
with:
|
||||||
host: ${{ secrets.EXPLORER_SSH_HOST }}
|
host: ${{ secrets.EXPLORER_SSH_HOST }}
|
||||||
username: ${{ secrets.EXPLORER_SSH_USERNAME }}
|
username: ${{ secrets.EXPLORER_SSH_USERNAME }}
|
||||||
@@ -53,7 +53,7 @@ jobs:
|
|||||||
rm: true
|
rm: true
|
||||||
target: ./local-ai
|
target: ./local-ai
|
||||||
- name: restarting
|
- name: restarting
|
||||||
uses: appleboy/ssh-action@v1.1.0
|
uses: appleboy/ssh-action@v1.2.0
|
||||||
with:
|
with:
|
||||||
host: ${{ secrets.EXPLORER_SSH_HOST }}
|
host: ${{ secrets.EXPLORER_SSH_HOST }}
|
||||||
username: ${{ secrets.EXPLORER_SSH_USERNAME }}
|
username: ${{ secrets.EXPLORER_SSH_USERNAME }}
|
||||||
|
|||||||
2
.github/workflows/generate_intel_image.yaml
vendored
2
.github/workflows/generate_intel_image.yaml
vendored
@@ -15,7 +15,7 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
include:
|
include:
|
||||||
- base-image: intel/oneapi-basekit:2024.2.0-devel-ubuntu22.04
|
- base-image: intel/oneapi-basekit:2025.0.0-0-devel-ubuntu22.04
|
||||||
runs-on: 'ubuntu-latest'
|
runs-on: 'ubuntu-latest'
|
||||||
platforms: 'linux/amd64'
|
platforms: 'linux/amd64'
|
||||||
runs-on: ${{matrix.runs-on}}
|
runs-on: ${{matrix.runs-on}}
|
||||||
|
|||||||
7
.github/workflows/test-extra.yml
vendored
7
.github/workflows/test-extra.yml
vendored
@@ -123,6 +123,13 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
make --jobs=5 --output-sync=target -C backend/python/parler-tts
|
make --jobs=5 --output-sync=target -C backend/python/parler-tts
|
||||||
make --jobs=5 --output-sync=target -C backend/python/parler-tts test
|
make --jobs=5 --output-sync=target -C backend/python/parler-tts test
|
||||||
|
- name: Setup tmate session if tests fail
|
||||||
|
if: ${{ failure() }}
|
||||||
|
uses: mxschmitt/action-tmate@v3.19
|
||||||
|
with:
|
||||||
|
detached: true
|
||||||
|
connect-timeout-seconds: 180
|
||||||
|
limit-access-to-actor: true
|
||||||
|
|
||||||
tests-openvoice:
|
tests-openvoice:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|||||||
2
.github/workflows/test.yml
vendored
2
.github/workflows/test.yml
vendored
@@ -224,7 +224,7 @@ jobs:
|
|||||||
- name: Dependencies
|
- name: Dependencies
|
||||||
run: |
|
run: |
|
||||||
brew install protobuf grpc make protoc-gen-go protoc-gen-go-grpc libomp llvm
|
brew install protobuf grpc make protoc-gen-go protoc-gen-go-grpc libomp llvm
|
||||||
pip install --user --no-cache-dir grpcio-tools==1.64.1
|
pip install --user --no-cache-dir grpcio-tools
|
||||||
- name: Test
|
- name: Test
|
||||||
run: |
|
run: |
|
||||||
export C_INCLUDE_PATH=/usr/local/include
|
export C_INCLUDE_PATH=/usr/local/include
|
||||||
|
|||||||
2
.gitignore
vendored
2
.gitignore
vendored
@@ -2,6 +2,7 @@
|
|||||||
/sources/
|
/sources/
|
||||||
__pycache__/
|
__pycache__/
|
||||||
*.a
|
*.a
|
||||||
|
*.o
|
||||||
get-sources
|
get-sources
|
||||||
prepare-sources
|
prepare-sources
|
||||||
/backend/cpp/llama/grpc-server
|
/backend/cpp/llama/grpc-server
|
||||||
@@ -12,7 +13,6 @@ prepare-sources
|
|||||||
|
|
||||||
go-ggml-transformers
|
go-ggml-transformers
|
||||||
go-gpt2
|
go-gpt2
|
||||||
go-rwkv
|
|
||||||
whisper.cpp
|
whisper.cpp
|
||||||
/bloomz
|
/bloomz
|
||||||
go-bert
|
go-bert
|
||||||
|
|||||||
@@ -85,7 +85,8 @@ WORKDIR /build
|
|||||||
# The requirements-extras target is for any builds with IMAGE_TYPE=extras. It should not be placed in this target unless every IMAGE_TYPE=extras build will use it
|
# The requirements-extras target is for any builds with IMAGE_TYPE=extras. It should not be placed in this target unless every IMAGE_TYPE=extras build will use it
|
||||||
FROM requirements-core AS requirements-extras
|
FROM requirements-core AS requirements-extras
|
||||||
|
|
||||||
RUN curl -LsSf https://astral.sh/uv/install.sh | sh
|
# Install uv as a system package
|
||||||
|
RUN curl -LsSf https://astral.sh/uv/install.sh | UV_INSTALL_DIR=/usr/bin sh
|
||||||
ENV PATH="/root/.cargo/bin:${PATH}"
|
ENV PATH="/root/.cargo/bin:${PATH}"
|
||||||
|
|
||||||
RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
|
RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
|
||||||
|
|||||||
237
Makefile
237
Makefile
@@ -8,23 +8,15 @@ DETECT_LIBS?=true
|
|||||||
# llama.cpp versions
|
# llama.cpp versions
|
||||||
GOLLAMA_REPO?=https://github.com/go-skynet/go-llama.cpp
|
GOLLAMA_REPO?=https://github.com/go-skynet/go-llama.cpp
|
||||||
GOLLAMA_VERSION?=2b57a8ae43e4699d3dc5d1496a1ccd42922993be
|
GOLLAMA_VERSION?=2b57a8ae43e4699d3dc5d1496a1ccd42922993be
|
||||||
CPPLLAMA_VERSION?=45f097645efb11b6d09a5b4adbbfd7c312ac0126
|
CPPLLAMA_VERSION?=dafae66cc242eb766797194d3c85c5e502625623
|
||||||
|
|
||||||
# go-rwkv version
|
|
||||||
RWKV_REPO?=https://github.com/donomii/go-rwkv.cpp
|
|
||||||
RWKV_VERSION?=661e7ae26d442f5cfebd2a0881b44e8c55949ec6
|
|
||||||
|
|
||||||
# whisper.cpp version
|
# whisper.cpp version
|
||||||
WHISPER_REPO?=https://github.com/ggerganov/whisper.cpp
|
WHISPER_REPO?=https://github.com/ggerganov/whisper.cpp
|
||||||
WHISPER_CPP_VERSION?=a5abfe6a90495f7bf19fe70d016ecc255e97359c
|
WHISPER_CPP_VERSION?=6266a9f9e56a5b925e9892acf650f3eb1245814d
|
||||||
|
|
||||||
# bert.cpp version
|
|
||||||
BERT_REPO?=https://github.com/go-skynet/go-bert.cpp
|
|
||||||
BERT_VERSION?=710044b124545415f555e4260d16b146c725a6e4
|
|
||||||
|
|
||||||
# go-piper version
|
# go-piper version
|
||||||
PIPER_REPO?=https://github.com/mudler/go-piper
|
PIPER_REPO?=https://github.com/mudler/go-piper
|
||||||
PIPER_VERSION?=9d0100873a7dbb0824dfea40e8cec70a1b110759
|
PIPER_VERSION?=e10ca041a885d4a8f3871d52924b47792d5e5aa0
|
||||||
|
|
||||||
# stablediffusion version
|
# stablediffusion version
|
||||||
STABLEDIFFUSION_REPO?=https://github.com/mudler/go-stable-diffusion
|
STABLEDIFFUSION_REPO?=https://github.com/mudler/go-stable-diffusion
|
||||||
@@ -34,8 +26,21 @@ STABLEDIFFUSION_VERSION?=4a3cd6aeae6f66ee57eae9a0075f8c58c3a6a38f
|
|||||||
TINYDREAM_REPO?=https://github.com/M0Rf30/go-tiny-dream
|
TINYDREAM_REPO?=https://github.com/M0Rf30/go-tiny-dream
|
||||||
TINYDREAM_VERSION?=c04fa463ace9d9a6464313aa5f9cd0f953b6c057
|
TINYDREAM_VERSION?=c04fa463ace9d9a6464313aa5f9cd0f953b6c057
|
||||||
|
|
||||||
|
# bark.cpp
|
||||||
|
BARKCPP_REPO?=https://github.com/PABannier/bark.cpp.git
|
||||||
|
BARKCPP_VERSION?=v1.0.0
|
||||||
|
|
||||||
|
# stablediffusion.cpp (ggml)
|
||||||
|
STABLEDIFFUSION_GGML_REPO?=https://github.com/leejet/stable-diffusion.cpp
|
||||||
|
STABLEDIFFUSION_GGML_VERSION?=9578fdcc4632dc3de5565f28e2fb16b7c18f8d48
|
||||||
|
|
||||||
|
ONNX_VERSION?=1.20.0
|
||||||
|
ONNX_ARCH?=x64
|
||||||
|
ONNX_OS?=linux
|
||||||
|
|
||||||
export BUILD_TYPE?=
|
export BUILD_TYPE?=
|
||||||
export STABLE_BUILD_TYPE?=$(BUILD_TYPE)
|
export STABLE_BUILD_TYPE?=$(BUILD_TYPE)
|
||||||
|
export GGML_CMAKE_ARGS?=
|
||||||
export CMAKE_ARGS?=
|
export CMAKE_ARGS?=
|
||||||
export BACKEND_LIBS?=
|
export BACKEND_LIBS?=
|
||||||
|
|
||||||
@@ -45,6 +50,7 @@ CGO_LDFLAGS_WHISPER+=-lggml
|
|||||||
CUDA_LIBPATH?=/usr/local/cuda/lib64/
|
CUDA_LIBPATH?=/usr/local/cuda/lib64/
|
||||||
GO_TAGS?=
|
GO_TAGS?=
|
||||||
BUILD_ID?=
|
BUILD_ID?=
|
||||||
|
NATIVE?=false
|
||||||
|
|
||||||
TEST_DIR=/tmp/test
|
TEST_DIR=/tmp/test
|
||||||
|
|
||||||
@@ -83,7 +89,61 @@ ifndef UNAME_S
|
|||||||
UNAME_S := $(shell uname -s)
|
UNAME_S := $(shell uname -s)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
# IF native is false, we add -DGGML_NATIVE=OFF to GGML_CMAKE_ARGS
|
||||||
|
ifeq ($(NATIVE),false)
|
||||||
|
GGML_CMAKE_ARGS+=-DGGML_NATIVE=OFF
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Disable Shared libs as we are linking on static gRPC and we can't mix shared and static
|
||||||
|
GGML_CMAKE_ARGS+=-DBUILD_SHARED_LIBS=OFF
|
||||||
|
|
||||||
|
# If build type is cublas, then we set -DGGML_CUDA=ON to GGML_CMAKE_ARGS automatically
|
||||||
|
ifeq ($(BUILD_TYPE),cublas)
|
||||||
|
GGML_CMAKE_ARGS+=-DGGML_CUDA=ON
|
||||||
|
# If build type is openblas then we set -DGGML_BLAS=ON -DGGML_BLAS_VENDOR=OpenBLAS
|
||||||
|
# to GGML_CMAKE_ARGS automatically
|
||||||
|
else ifeq ($(BUILD_TYPE),openblas)
|
||||||
|
GGML_CMAKE_ARGS+=-DGGML_BLAS=ON -DGGML_BLAS_VENDOR=OpenBLAS
|
||||||
|
# If build type is clblas (openCL) we set -DGGML_CLBLAST=ON -DCLBlast_DIR=/some/path
|
||||||
|
else ifeq ($(BUILD_TYPE),clblas)
|
||||||
|
GGML_CMAKE_ARGS+=-DGGML_CLBLAST=ON -DCLBlast_DIR=/some/path
|
||||||
|
# If it's hipblas we do have also to set CC=/opt/rocm/llvm/bin/clang CXX=/opt/rocm/llvm/bin/clang++
|
||||||
|
else ifeq ($(BUILD_TYPE),hipblas)
|
||||||
|
GGML_CMAKE_ARGS+=-DGGML_HIP=ON
|
||||||
|
# If it's OSX, DO NOT embed the metal library - -DGGML_METAL_EMBED_LIBRARY=ON requires further investigation
|
||||||
|
# But if it's OSX without metal, disable it here
|
||||||
|
else ifeq ($(OS),Darwin)
|
||||||
|
ifneq ($(BUILD_TYPE),metal)
|
||||||
|
GGML_CMAKE_ARGS+=-DGGML_METAL=OFF
|
||||||
|
else
|
||||||
|
GGML_CMAKE_ARGS+=-DGGML_METAL=ON
|
||||||
|
GGML_CMAKE_ARGS+=-DGGML_METAL_EMBED_LIBRARY=ON
|
||||||
|
TARGET+=--target ggml-metal
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(BUILD_TYPE),sycl_f16)
|
||||||
|
GGML_CMAKE_ARGS+=-DGGML_SYCL=ON -DCMAKE_C_COMPILER=icx -DCMAKE_CXX_COMPILER=icpx -DGGML_SYCL_F16=ON
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(BUILD_TYPE),sycl_f32)
|
||||||
|
GGML_CMAKE_ARGS+=-DGGML_SYCL=ON -DCMAKE_C_COMPILER=icx -DCMAKE_CXX_COMPILER=icpx
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Detect if we are running on arm64
|
||||||
|
ifneq (,$(findstring aarch64,$(shell uname -m)))
|
||||||
|
ONNX_ARCH=aarch64
|
||||||
|
endif
|
||||||
|
|
||||||
ifeq ($(OS),Darwin)
|
ifeq ($(OS),Darwin)
|
||||||
|
ONNX_OS=osx
|
||||||
|
ifneq (,$(findstring aarch64,$(shell uname -m)))
|
||||||
|
ONNX_ARCH=arm64
|
||||||
|
else ifneq (,$(findstring arm64,$(shell uname -m)))
|
||||||
|
ONNX_ARCH=arm64
|
||||||
|
else
|
||||||
|
ONNX_ARCH=x86_64
|
||||||
|
endif
|
||||||
|
|
||||||
ifeq ($(OSX_SIGNING_IDENTITY),)
|
ifeq ($(OSX_SIGNING_IDENTITY),)
|
||||||
OSX_SIGNING_IDENTITY := $(shell security find-identity -v -p codesigning | grep '"' | head -n 1 | sed -E 's/.*"(.*)"/\1/')
|
OSX_SIGNING_IDENTITY := $(shell security find-identity -v -p codesigning | grep '"' | head -n 1 | sed -E 's/.*"(.*)"/\1/')
|
||||||
@@ -94,7 +154,7 @@ ifeq ($(OS),Darwin)
|
|||||||
BUILD_TYPE=metal
|
BUILD_TYPE=metal
|
||||||
# disable metal if on Darwin and any other value is explicitly passed.
|
# disable metal if on Darwin and any other value is explicitly passed.
|
||||||
else ifneq ($(BUILD_TYPE),metal)
|
else ifneq ($(BUILD_TYPE),metal)
|
||||||
CMAKE_ARGS+=-DGGML_METAL=OFF
|
GGML_CMAKE_ARGS+=-DGGML_METAL=OFF
|
||||||
export GGML_NO_ACCELERATE=1
|
export GGML_NO_ACCELERATE=1
|
||||||
export GGML_NO_METAL=1
|
export GGML_NO_METAL=1
|
||||||
endif
|
endif
|
||||||
@@ -119,7 +179,7 @@ ifeq ($(BUILD_TYPE),cublas)
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(BUILD_TYPE),vulkan)
|
ifeq ($(BUILD_TYPE),vulkan)
|
||||||
CMAKE_ARGS+=-DGGML_VULKAN=1
|
GGML_CMAKE_ARGS+=-DGGML_VULKAN=1
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifneq (,$(findstring sycl,$(BUILD_TYPE)))
|
ifneq (,$(findstring sycl,$(BUILD_TYPE)))
|
||||||
@@ -138,10 +198,10 @@ ifeq ($(BUILD_TYPE),hipblas)
|
|||||||
export CC=$(ROCM_HOME)/llvm/bin/clang
|
export CC=$(ROCM_HOME)/llvm/bin/clang
|
||||||
# llama-ggml has no hipblas support, so override it here.
|
# llama-ggml has no hipblas support, so override it here.
|
||||||
export STABLE_BUILD_TYPE=
|
export STABLE_BUILD_TYPE=
|
||||||
export GGML_HIPBLAS=1
|
export GGML_HIP=1
|
||||||
GPU_TARGETS ?= gfx900,gfx906,gfx908,gfx940,gfx941,gfx942,gfx90a,gfx1030,gfx1031,gfx1100,gfx1101
|
GPU_TARGETS ?= gfx900,gfx906,gfx908,gfx940,gfx941,gfx942,gfx90a,gfx1030,gfx1031,gfx1100,gfx1101
|
||||||
AMDGPU_TARGETS ?= "$(GPU_TARGETS)"
|
AMDGPU_TARGETS ?= "$(GPU_TARGETS)"
|
||||||
CMAKE_ARGS+=-DGGML_HIPBLAS=ON -DAMDGPU_TARGETS="$(AMDGPU_TARGETS)" -DGPU_TARGETS="$(GPU_TARGETS)"
|
GGML_CMAKE_ARGS+=-DGGML_HIP=ON -DAMDGPU_TARGETS="$(AMDGPU_TARGETS)" -DGPU_TARGETS="$(GPU_TARGETS)"
|
||||||
CGO_LDFLAGS += -O3 --rtlib=compiler-rt -unwindlib=libgcc -lhipblas -lrocblas --hip-link -L${ROCM_HOME}/lib/llvm/lib
|
CGO_LDFLAGS += -O3 --rtlib=compiler-rt -unwindlib=libgcc -lhipblas -lrocblas --hip-link -L${ROCM_HOME}/lib/llvm/lib
|
||||||
endif
|
endif
|
||||||
|
|
||||||
@@ -179,16 +239,23 @@ ifeq ($(findstring tts,$(GO_TAGS)),tts)
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
ALL_GRPC_BACKENDS=backend-assets/grpc/huggingface
|
ALL_GRPC_BACKENDS=backend-assets/grpc/huggingface
|
||||||
ALL_GRPC_BACKENDS+=backend-assets/grpc/bert-embeddings
|
|
||||||
ALL_GRPC_BACKENDS+=backend-assets/grpc/llama-cpp-avx
|
ALL_GRPC_BACKENDS+=backend-assets/grpc/llama-cpp-avx
|
||||||
ALL_GRPC_BACKENDS+=backend-assets/grpc/llama-cpp-avx2
|
ALL_GRPC_BACKENDS+=backend-assets/grpc/llama-cpp-avx2
|
||||||
ALL_GRPC_BACKENDS+=backend-assets/grpc/llama-cpp-fallback
|
ALL_GRPC_BACKENDS+=backend-assets/grpc/llama-cpp-fallback
|
||||||
ALL_GRPC_BACKENDS+=backend-assets/grpc/llama-ggml
|
ALL_GRPC_BACKENDS+=backend-assets/grpc/llama-ggml
|
||||||
ALL_GRPC_BACKENDS+=backend-assets/grpc/llama-cpp-grpc
|
ALL_GRPC_BACKENDS+=backend-assets/grpc/llama-cpp-grpc
|
||||||
ALL_GRPC_BACKENDS+=backend-assets/util/llama-cpp-rpc-server
|
ALL_GRPC_BACKENDS+=backend-assets/util/llama-cpp-rpc-server
|
||||||
ALL_GRPC_BACKENDS+=backend-assets/grpc/rwkv
|
|
||||||
ALL_GRPC_BACKENDS+=backend-assets/grpc/whisper
|
ALL_GRPC_BACKENDS+=backend-assets/grpc/whisper
|
||||||
|
|
||||||
|
ifeq ($(ONNX_OS),linux)
|
||||||
|
ifeq ($(ONNX_ARCH),x64)
|
||||||
|
ALL_GRPC_BACKENDS+=backend-assets/grpc/bark-cpp
|
||||||
|
ALL_GRPC_BACKENDS+=backend-assets/grpc/stablediffusion-ggml
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
ALL_GRPC_BACKENDS+=backend-assets/grpc/local-store
|
ALL_GRPC_BACKENDS+=backend-assets/grpc/local-store
|
||||||
|
ALL_GRPC_BACKENDS+=backend-assets/grpc/silero-vad
|
||||||
ALL_GRPC_BACKENDS+=$(OPTIONAL_GRPC)
|
ALL_GRPC_BACKENDS+=$(OPTIONAL_GRPC)
|
||||||
# Use filter-out to remove the specified backends
|
# Use filter-out to remove the specified backends
|
||||||
ALL_GRPC_BACKENDS := $(filter-out $(SKIP_GRPC_BACKEND),$(ALL_GRPC_BACKENDS))
|
ALL_GRPC_BACKENDS := $(filter-out $(SKIP_GRPC_BACKEND),$(ALL_GRPC_BACKENDS))
|
||||||
@@ -205,23 +272,12 @@ ifeq ($(BUILD_API_ONLY),true)
|
|||||||
GRPC_BACKENDS=
|
GRPC_BACKENDS=
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
export CMAKE_ARGS?=$(GGML_CMAKE_ARGS)
|
||||||
|
|
||||||
.PHONY: all test build vendor get-sources prepare-sources prepare
|
.PHONY: all test build vendor get-sources prepare-sources prepare
|
||||||
|
|
||||||
all: help
|
all: help
|
||||||
|
|
||||||
## BERT embeddings
|
|
||||||
sources/go-bert.cpp:
|
|
||||||
mkdir -p sources/go-bert.cpp
|
|
||||||
cd sources/go-bert.cpp && \
|
|
||||||
git init && \
|
|
||||||
git remote add origin $(BERT_REPO) && \
|
|
||||||
git fetch origin && \
|
|
||||||
git checkout $(BERT_VERSION) && \
|
|
||||||
git submodule update --init --recursive --depth 1 --single-branch
|
|
||||||
|
|
||||||
sources/go-bert.cpp/libgobert.a: sources/go-bert.cpp
|
|
||||||
$(MAKE) -C sources/go-bert.cpp libgobert.a
|
|
||||||
|
|
||||||
## go-llama.cpp
|
## go-llama.cpp
|
||||||
sources/go-llama.cpp:
|
sources/go-llama.cpp:
|
||||||
mkdir -p sources/go-llama.cpp
|
mkdir -p sources/go-llama.cpp
|
||||||
@@ -235,6 +291,23 @@ sources/go-llama.cpp:
|
|||||||
sources/go-llama.cpp/libbinding.a: sources/go-llama.cpp
|
sources/go-llama.cpp/libbinding.a: sources/go-llama.cpp
|
||||||
$(MAKE) -C sources/go-llama.cpp BUILD_TYPE=$(STABLE_BUILD_TYPE) libbinding.a
|
$(MAKE) -C sources/go-llama.cpp BUILD_TYPE=$(STABLE_BUILD_TYPE) libbinding.a
|
||||||
|
|
||||||
|
## bark.cpp
|
||||||
|
sources/bark.cpp:
|
||||||
|
git clone --recursive $(BARKCPP_REPO) sources/bark.cpp && \
|
||||||
|
cd sources/bark.cpp && \
|
||||||
|
git checkout $(BARKCPP_VERSION) && \
|
||||||
|
git submodule update --init --recursive --depth 1 --single-branch
|
||||||
|
|
||||||
|
sources/bark.cpp/build/libbark.a: sources/bark.cpp
|
||||||
|
cd sources/bark.cpp && \
|
||||||
|
mkdir -p build && \
|
||||||
|
cd build && \
|
||||||
|
cmake $(CMAKE_ARGS) .. && \
|
||||||
|
cmake --build . --config Release
|
||||||
|
|
||||||
|
backend/go/bark/libbark.a: sources/bark.cpp/build/libbark.a
|
||||||
|
$(MAKE) -C backend/go/bark libbark.a
|
||||||
|
|
||||||
## go-piper
|
## go-piper
|
||||||
sources/go-piper:
|
sources/go-piper:
|
||||||
mkdir -p sources/go-piper
|
mkdir -p sources/go-piper
|
||||||
@@ -248,21 +321,7 @@ sources/go-piper:
|
|||||||
sources/go-piper/libpiper_binding.a: sources/go-piper
|
sources/go-piper/libpiper_binding.a: sources/go-piper
|
||||||
$(MAKE) -C sources/go-piper libpiper_binding.a example/main piper.o
|
$(MAKE) -C sources/go-piper libpiper_binding.a example/main piper.o
|
||||||
|
|
||||||
|
## stable diffusion (onnx)
|
||||||
## RWKV
|
|
||||||
sources/go-rwkv.cpp:
|
|
||||||
mkdir -p sources/go-rwkv.cpp
|
|
||||||
cd sources/go-rwkv.cpp && \
|
|
||||||
git init && \
|
|
||||||
git remote add origin $(RWKV_REPO) && \
|
|
||||||
git fetch origin && \
|
|
||||||
git checkout $(RWKV_VERSION) && \
|
|
||||||
git submodule update --init --recursive --depth 1 --single-branch
|
|
||||||
|
|
||||||
sources/go-rwkv.cpp/librwkv.a: sources/go-rwkv.cpp
|
|
||||||
cd sources/go-rwkv.cpp && cd rwkv.cpp && cmake . -DRWKV_BUILD_SHARED_LIBRARY=OFF && cmake --build . && cp librwkv.a ..
|
|
||||||
|
|
||||||
## stable diffusion
|
|
||||||
sources/go-stable-diffusion:
|
sources/go-stable-diffusion:
|
||||||
mkdir -p sources/go-stable-diffusion
|
mkdir -p sources/go-stable-diffusion
|
||||||
cd sources/go-stable-diffusion && \
|
cd sources/go-stable-diffusion && \
|
||||||
@@ -275,6 +334,44 @@ sources/go-stable-diffusion:
|
|||||||
sources/go-stable-diffusion/libstablediffusion.a: sources/go-stable-diffusion
|
sources/go-stable-diffusion/libstablediffusion.a: sources/go-stable-diffusion
|
||||||
CPATH="$(CPATH):/usr/include/opencv4" $(MAKE) -C sources/go-stable-diffusion libstablediffusion.a
|
CPATH="$(CPATH):/usr/include/opencv4" $(MAKE) -C sources/go-stable-diffusion libstablediffusion.a
|
||||||
|
|
||||||
|
## stablediffusion (ggml)
|
||||||
|
sources/stablediffusion-ggml.cpp:
|
||||||
|
git clone --recursive $(STABLEDIFFUSION_GGML_REPO) sources/stablediffusion-ggml.cpp && \
|
||||||
|
cd sources/stablediffusion-ggml.cpp && \
|
||||||
|
git checkout $(STABLEDIFFUSION_GGML_VERSION) && \
|
||||||
|
git submodule update --init --recursive --depth 1 --single-branch
|
||||||
|
|
||||||
|
sources/stablediffusion-ggml.cpp/build/libstable-diffusion.a: sources/stablediffusion-ggml.cpp
|
||||||
|
cd sources/stablediffusion-ggml.cpp && \
|
||||||
|
mkdir -p build && \
|
||||||
|
cd build && \
|
||||||
|
cmake $(CMAKE_ARGS) .. && \
|
||||||
|
cmake --build . --config Release
|
||||||
|
|
||||||
|
backend/go/image/stablediffusion-ggml/libsd.a: sources/stablediffusion-ggml.cpp/build/libstable-diffusion.a
|
||||||
|
$(MAKE) -C backend/go/image/stablediffusion-ggml libsd.a
|
||||||
|
|
||||||
|
backend-assets/grpc/stablediffusion-ggml: backend/go/image/stablediffusion-ggml/libsd.a backend-assets/grpc
|
||||||
|
CGO_LDFLAGS="$(CGO_LDFLAGS)" C_INCLUDE_PATH=$(CURDIR)/backend/go/image/stablediffusion-ggml/ LIBRARY_PATH=$(CURDIR)/backend/go/image/stablediffusion-ggml/ \
|
||||||
|
$(GOCMD) build -ldflags "$(LD_FLAGS)" -tags "$(GO_TAGS)" -o backend-assets/grpc/stablediffusion-ggml ./backend/go/image/stablediffusion-ggml/
|
||||||
|
ifneq ($(UPX),)
|
||||||
|
$(UPX) backend-assets/grpc/stablediffusion-ggml
|
||||||
|
endif
|
||||||
|
|
||||||
|
sources/onnxruntime:
|
||||||
|
mkdir -p sources/onnxruntime
|
||||||
|
curl -L https://github.com/microsoft/onnxruntime/releases/download/v$(ONNX_VERSION)/onnxruntime-$(ONNX_OS)-$(ONNX_ARCH)-$(ONNX_VERSION).tgz -o sources/onnxruntime/onnxruntime-$(ONNX_OS)-$(ONNX_ARCH)-$(ONNX_VERSION).tgz
|
||||||
|
cd sources/onnxruntime && tar -xvf onnxruntime-$(ONNX_OS)-$(ONNX_ARCH)-$(ONNX_VERSION).tgz && rm onnxruntime-$(ONNX_OS)-$(ONNX_ARCH)-$(ONNX_VERSION).tgz
|
||||||
|
cd sources/onnxruntime && mv onnxruntime-$(ONNX_OS)-$(ONNX_ARCH)-$(ONNX_VERSION)/* ./
|
||||||
|
|
||||||
|
backend-assets/lib/libonnxruntime.so.1: backend-assets/lib sources/onnxruntime
|
||||||
|
cp -rfv sources/onnxruntime/lib/* backend-assets/lib/
|
||||||
|
ifeq ($(OS),Darwin)
|
||||||
|
mv backend-assets/lib/libonnxruntime.$(ONNX_VERSION).dylib backend-assets/lib/libonnxruntime.dylib
|
||||||
|
else
|
||||||
|
mv backend-assets/lib/libonnxruntime.so.$(ONNX_VERSION) backend-assets/lib/libonnxruntime.so.1
|
||||||
|
endif
|
||||||
|
|
||||||
## tiny-dream
|
## tiny-dream
|
||||||
sources/go-tiny-dream:
|
sources/go-tiny-dream:
|
||||||
mkdir -p sources/go-tiny-dream
|
mkdir -p sources/go-tiny-dream
|
||||||
@@ -301,23 +398,19 @@ sources/whisper.cpp:
|
|||||||
sources/whisper.cpp/libwhisper.a: sources/whisper.cpp
|
sources/whisper.cpp/libwhisper.a: sources/whisper.cpp
|
||||||
cd sources/whisper.cpp && $(MAKE) libwhisper.a libggml.a
|
cd sources/whisper.cpp && $(MAKE) libwhisper.a libggml.a
|
||||||
|
|
||||||
get-sources: sources/go-llama.cpp sources/go-piper sources/go-rwkv.cpp sources/whisper.cpp sources/go-bert.cpp sources/go-stable-diffusion sources/go-tiny-dream backend/cpp/llama/llama.cpp
|
get-sources: sources/go-llama.cpp sources/go-piper sources/stablediffusion-ggml.cpp sources/bark.cpp sources/whisper.cpp sources/go-stable-diffusion sources/go-tiny-dream backend/cpp/llama/llama.cpp
|
||||||
|
|
||||||
replace:
|
replace:
|
||||||
$(GOCMD) mod edit -replace github.com/donomii/go-rwkv.cpp=$(CURDIR)/sources/go-rwkv.cpp
|
|
||||||
$(GOCMD) mod edit -replace github.com/ggerganov/whisper.cpp=$(CURDIR)/sources/whisper.cpp
|
$(GOCMD) mod edit -replace github.com/ggerganov/whisper.cpp=$(CURDIR)/sources/whisper.cpp
|
||||||
$(GOCMD) mod edit -replace github.com/ggerganov/whisper.cpp/bindings/go=$(CURDIR)/sources/whisper.cpp/bindings/go
|
$(GOCMD) mod edit -replace github.com/ggerganov/whisper.cpp/bindings/go=$(CURDIR)/sources/whisper.cpp/bindings/go
|
||||||
$(GOCMD) mod edit -replace github.com/go-skynet/go-bert.cpp=$(CURDIR)/sources/go-bert.cpp
|
|
||||||
$(GOCMD) mod edit -replace github.com/M0Rf30/go-tiny-dream=$(CURDIR)/sources/go-tiny-dream
|
$(GOCMD) mod edit -replace github.com/M0Rf30/go-tiny-dream=$(CURDIR)/sources/go-tiny-dream
|
||||||
$(GOCMD) mod edit -replace github.com/mudler/go-piper=$(CURDIR)/sources/go-piper
|
$(GOCMD) mod edit -replace github.com/mudler/go-piper=$(CURDIR)/sources/go-piper
|
||||||
$(GOCMD) mod edit -replace github.com/mudler/go-stable-diffusion=$(CURDIR)/sources/go-stable-diffusion
|
$(GOCMD) mod edit -replace github.com/mudler/go-stable-diffusion=$(CURDIR)/sources/go-stable-diffusion
|
||||||
$(GOCMD) mod edit -replace github.com/go-skynet/go-llama.cpp=$(CURDIR)/sources/go-llama.cpp
|
$(GOCMD) mod edit -replace github.com/go-skynet/go-llama.cpp=$(CURDIR)/sources/go-llama.cpp
|
||||||
|
|
||||||
dropreplace:
|
dropreplace:
|
||||||
$(GOCMD) mod edit -dropreplace github.com/donomii/go-rwkv.cpp
|
|
||||||
$(GOCMD) mod edit -dropreplace github.com/ggerganov/whisper.cpp
|
$(GOCMD) mod edit -dropreplace github.com/ggerganov/whisper.cpp
|
||||||
$(GOCMD) mod edit -dropreplace github.com/ggerganov/whisper.cpp/bindings/go
|
$(GOCMD) mod edit -dropreplace github.com/ggerganov/whisper.cpp/bindings/go
|
||||||
$(GOCMD) mod edit -dropreplace github.com/go-skynet/go-bert.cpp
|
|
||||||
$(GOCMD) mod edit -dropreplace github.com/M0Rf30/go-tiny-dream
|
$(GOCMD) mod edit -dropreplace github.com/M0Rf30/go-tiny-dream
|
||||||
$(GOCMD) mod edit -dropreplace github.com/mudler/go-piper
|
$(GOCMD) mod edit -dropreplace github.com/mudler/go-piper
|
||||||
$(GOCMD) mod edit -dropreplace github.com/mudler/go-stable-diffusion
|
$(GOCMD) mod edit -dropreplace github.com/mudler/go-stable-diffusion
|
||||||
@@ -330,10 +423,8 @@ prepare-sources: get-sources replace
|
|||||||
rebuild: ## Rebuilds the project
|
rebuild: ## Rebuilds the project
|
||||||
$(GOCMD) clean -cache
|
$(GOCMD) clean -cache
|
||||||
$(MAKE) -C sources/go-llama.cpp clean
|
$(MAKE) -C sources/go-llama.cpp clean
|
||||||
$(MAKE) -C sources/go-rwkv.cpp clean
|
|
||||||
$(MAKE) -C sources/whisper.cpp clean
|
$(MAKE) -C sources/whisper.cpp clean
|
||||||
$(MAKE) -C sources/go-stable-diffusion clean
|
$(MAKE) -C sources/go-stable-diffusion clean
|
||||||
$(MAKE) -C sources/go-bert.cpp clean
|
|
||||||
$(MAKE) -C sources/go-piper clean
|
$(MAKE) -C sources/go-piper clean
|
||||||
$(MAKE) -C sources/go-tiny-dream clean
|
$(MAKE) -C sources/go-tiny-dream clean
|
||||||
$(MAKE) build
|
$(MAKE) build
|
||||||
@@ -348,7 +439,9 @@ clean: ## Remove build related file
|
|||||||
rm -rf release/
|
rm -rf release/
|
||||||
rm -rf backend-assets/*
|
rm -rf backend-assets/*
|
||||||
$(MAKE) -C backend/cpp/grpc clean
|
$(MAKE) -C backend/cpp/grpc clean
|
||||||
|
$(MAKE) -C backend/go/bark clean
|
||||||
$(MAKE) -C backend/cpp/llama clean
|
$(MAKE) -C backend/cpp/llama clean
|
||||||
|
$(MAKE) -C backend/go/image/stablediffusion-ggml clean
|
||||||
rm -rf backend/cpp/llama-* || true
|
rm -rf backend/cpp/llama-* || true
|
||||||
$(MAKE) dropreplace
|
$(MAKE) dropreplace
|
||||||
$(MAKE) protogen-clean
|
$(MAKE) protogen-clean
|
||||||
@@ -439,8 +532,6 @@ test-models/testmodel.ggml:
|
|||||||
wget -q https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-base.en.bin -O test-models/whisper-en
|
wget -q https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-base.en.bin -O test-models/whisper-en
|
||||||
wget -q https://huggingface.co/mudler/all-MiniLM-L6-v2/resolve/main/ggml-model-q4_0.bin -O test-models/bert
|
wget -q https://huggingface.co/mudler/all-MiniLM-L6-v2/resolve/main/ggml-model-q4_0.bin -O test-models/bert
|
||||||
wget -q https://cdn.openai.com/whisper/draft-20220913a/micro-machines.wav -O test-dir/audio.wav
|
wget -q https://cdn.openai.com/whisper/draft-20220913a/micro-machines.wav -O test-dir/audio.wav
|
||||||
wget -q https://huggingface.co/mudler/rwkv-4-raven-1.5B-ggml/resolve/main/RWKV-4-Raven-1B5-v11-Eng99%2525-Other1%2525-20230425-ctx4096_Q4_0.bin -O test-models/rwkv
|
|
||||||
wget -q https://raw.githubusercontent.com/saharNooby/rwkv.cpp/5eb8f09c146ea8124633ab041d9ea0b1f1db4459/rwkv/20B_tokenizer.json -O test-models/rwkv.tokenizer.json
|
|
||||||
cp tests/models_fixtures/* test-models
|
cp tests/models_fixtures/* test-models
|
||||||
|
|
||||||
prepare-test: grpcs
|
prepare-test: grpcs
|
||||||
@@ -693,13 +784,6 @@ backend-assets/espeak-ng-data: sources/go-piper sources/go-piper/libpiper_bindin
|
|||||||
backend-assets/grpc: protogen-go replace
|
backend-assets/grpc: protogen-go replace
|
||||||
mkdir -p backend-assets/grpc
|
mkdir -p backend-assets/grpc
|
||||||
|
|
||||||
backend-assets/grpc/bert-embeddings: sources/go-bert.cpp sources/go-bert.cpp/libgobert.a backend-assets/grpc
|
|
||||||
CGO_LDFLAGS="$(CGO_LDFLAGS)" C_INCLUDE_PATH=$(CURDIR)/sources/go-bert.cpp LIBRARY_PATH=$(CURDIR)/sources/go-bert.cpp \
|
|
||||||
$(GOCMD) build -ldflags "$(LD_FLAGS)" -tags "$(GO_TAGS)" -o backend-assets/grpc/bert-embeddings ./backend/go/llm/bert/
|
|
||||||
ifneq ($(UPX),)
|
|
||||||
$(UPX) backend-assets/grpc/bert-embeddings
|
|
||||||
endif
|
|
||||||
|
|
||||||
backend-assets/grpc/huggingface: backend-assets/grpc
|
backend-assets/grpc/huggingface: backend-assets/grpc
|
||||||
$(GOCMD) build -ldflags "$(LD_FLAGS)" -tags "$(GO_TAGS)" -o backend-assets/grpc/huggingface ./backend/go/llm/langchain/
|
$(GOCMD) build -ldflags "$(LD_FLAGS)" -tags "$(GO_TAGS)" -o backend-assets/grpc/huggingface ./backend/go/llm/langchain/
|
||||||
ifneq ($(UPX),)
|
ifneq ($(UPX),)
|
||||||
@@ -759,10 +843,6 @@ backend-assets/grpc/llama-cpp-fallback: backend-assets/grpc backend/cpp/llama/ll
|
|||||||
$(info ${GREEN}I llama-cpp build info:fallback${RESET})
|
$(info ${GREEN}I llama-cpp build info:fallback${RESET})
|
||||||
CMAKE_ARGS="$(CMAKE_ARGS) -DGGML_AVX=off -DGGML_AVX2=off -DGGML_AVX512=off -DGGML_FMA=off -DGGML_F16C=off" $(MAKE) VARIANT="llama-fallback" build-llama-cpp-grpc-server
|
CMAKE_ARGS="$(CMAKE_ARGS) -DGGML_AVX=off -DGGML_AVX2=off -DGGML_AVX512=off -DGGML_FMA=off -DGGML_F16C=off" $(MAKE) VARIANT="llama-fallback" build-llama-cpp-grpc-server
|
||||||
cp -rfv backend/cpp/llama-fallback/grpc-server backend-assets/grpc/llama-cpp-fallback
|
cp -rfv backend/cpp/llama-fallback/grpc-server backend-assets/grpc/llama-cpp-fallback
|
||||||
# TODO: every binary should have its own folder instead, so can have different metal implementations
|
|
||||||
ifeq ($(BUILD_TYPE),metal)
|
|
||||||
cp backend/cpp/llama-fallback/llama.cpp/build/bin/default.metallib backend-assets/grpc/
|
|
||||||
endif
|
|
||||||
|
|
||||||
backend-assets/grpc/llama-cpp-cuda: backend-assets/grpc backend/cpp/llama/llama.cpp
|
backend-assets/grpc/llama-cpp-cuda: backend-assets/grpc backend/cpp/llama/llama.cpp
|
||||||
cp -rf backend/cpp/llama backend/cpp/llama-cuda
|
cp -rf backend/cpp/llama backend/cpp/llama-cuda
|
||||||
@@ -775,7 +855,7 @@ backend-assets/grpc/llama-cpp-hipblas: backend-assets/grpc backend/cpp/llama/lla
|
|||||||
cp -rf backend/cpp/llama backend/cpp/llama-hipblas
|
cp -rf backend/cpp/llama backend/cpp/llama-hipblas
|
||||||
$(MAKE) -C backend/cpp/llama-hipblas purge
|
$(MAKE) -C backend/cpp/llama-hipblas purge
|
||||||
$(info ${GREEN}I llama-cpp build info:hipblas${RESET})
|
$(info ${GREEN}I llama-cpp build info:hipblas${RESET})
|
||||||
BUILD_TYPE="hipblas" $(MAKE) VARIANT="llama-hipblas" build-llama-cpp-grpc-server
|
CMAKE_ARGS="$(CMAKE_ARGS) -DGGML_AVX=off -DGGML_AVX2=off -DGGML_AVX512=off -DGGML_FMA=off -DGGML_F16C=off" BUILD_TYPE="hipblas" $(MAKE) VARIANT="llama-hipblas" build-llama-cpp-grpc-server
|
||||||
cp -rfv backend/cpp/llama-hipblas/grpc-server backend-assets/grpc/llama-cpp-hipblas
|
cp -rfv backend/cpp/llama-hipblas/grpc-server backend-assets/grpc/llama-cpp-hipblas
|
||||||
|
|
||||||
backend-assets/grpc/llama-cpp-sycl_f16: backend-assets/grpc backend/cpp/llama/llama.cpp
|
backend-assets/grpc/llama-cpp-sycl_f16: backend-assets/grpc backend/cpp/llama/llama.cpp
|
||||||
@@ -810,6 +890,13 @@ ifneq ($(UPX),)
|
|||||||
$(UPX) backend-assets/grpc/llama-ggml
|
$(UPX) backend-assets/grpc/llama-ggml
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
backend-assets/grpc/bark-cpp: backend/go/bark/libbark.a backend-assets/grpc
|
||||||
|
CGO_LDFLAGS="$(CGO_LDFLAGS)" C_INCLUDE_PATH=$(CURDIR)/backend/go/bark/ LIBRARY_PATH=$(CURDIR)/backend/go/bark/ \
|
||||||
|
$(GOCMD) build -ldflags "$(LD_FLAGS)" -tags "$(GO_TAGS)" -o backend-assets/grpc/bark-cpp ./backend/go/bark/
|
||||||
|
ifneq ($(UPX),)
|
||||||
|
$(UPX) backend-assets/grpc/bark-cpp
|
||||||
|
endif
|
||||||
|
|
||||||
backend-assets/grpc/piper: sources/go-piper sources/go-piper/libpiper_binding.a backend-assets/grpc backend-assets/espeak-ng-data
|
backend-assets/grpc/piper: sources/go-piper sources/go-piper/libpiper_binding.a backend-assets/grpc backend-assets/espeak-ng-data
|
||||||
CGO_CXXFLAGS="$(PIPER_CGO_CXXFLAGS)" CGO_LDFLAGS="$(PIPER_CGO_LDFLAGS)" LIBRARY_PATH=$(CURDIR)/sources/go-piper \
|
CGO_CXXFLAGS="$(PIPER_CGO_CXXFLAGS)" CGO_LDFLAGS="$(PIPER_CGO_LDFLAGS)" LIBRARY_PATH=$(CURDIR)/sources/go-piper \
|
||||||
$(GOCMD) build -ldflags "$(LD_FLAGS)" -tags "$(GO_TAGS)" -o backend-assets/grpc/piper ./backend/go/tts/
|
$(GOCMD) build -ldflags "$(LD_FLAGS)" -tags "$(GO_TAGS)" -o backend-assets/grpc/piper ./backend/go/tts/
|
||||||
@@ -817,13 +904,6 @@ ifneq ($(UPX),)
|
|||||||
$(UPX) backend-assets/grpc/piper
|
$(UPX) backend-assets/grpc/piper
|
||||||
endif
|
endif
|
||||||
|
|
||||||
backend-assets/grpc/rwkv: sources/go-rwkv.cpp sources/go-rwkv.cpp/librwkv.a backend-assets/grpc
|
|
||||||
CGO_LDFLAGS="$(CGO_LDFLAGS)" C_INCLUDE_PATH=$(CURDIR)/sources/go-rwkv.cpp LIBRARY_PATH=$(CURDIR)/sources/go-rwkv.cpp \
|
|
||||||
$(GOCMD) build -ldflags "$(LD_FLAGS)" -tags "$(GO_TAGS)" -o backend-assets/grpc/rwkv ./backend/go/llm/rwkv
|
|
||||||
ifneq ($(UPX),)
|
|
||||||
$(UPX) backend-assets/grpc/rwkv
|
|
||||||
endif
|
|
||||||
|
|
||||||
backend-assets/grpc/stablediffusion: sources/go-stable-diffusion sources/go-stable-diffusion/libstablediffusion.a backend-assets/grpc
|
backend-assets/grpc/stablediffusion: sources/go-stable-diffusion sources/go-stable-diffusion/libstablediffusion.a backend-assets/grpc
|
||||||
CGO_LDFLAGS="$(CGO_LDFLAGS)" CPATH="$(CPATH):$(CURDIR)/sources/go-stable-diffusion/:/usr/include/opencv4" LIBRARY_PATH=$(CURDIR)/sources/go-stable-diffusion/ \
|
CGO_LDFLAGS="$(CGO_LDFLAGS)" CPATH="$(CPATH):$(CURDIR)/sources/go-stable-diffusion/:/usr/include/opencv4" LIBRARY_PATH=$(CURDIR)/sources/go-stable-diffusion/ \
|
||||||
$(GOCMD) build -ldflags "$(LD_FLAGS)" -tags "$(GO_TAGS)" -o backend-assets/grpc/stablediffusion ./backend/go/image/stablediffusion
|
$(GOCMD) build -ldflags "$(LD_FLAGS)" -tags "$(GO_TAGS)" -o backend-assets/grpc/stablediffusion ./backend/go/image/stablediffusion
|
||||||
@@ -831,6 +911,13 @@ ifneq ($(UPX),)
|
|||||||
$(UPX) backend-assets/grpc/stablediffusion
|
$(UPX) backend-assets/grpc/stablediffusion
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
backend-assets/grpc/silero-vad: backend-assets/grpc backend-assets/lib/libonnxruntime.so.1
|
||||||
|
CGO_LDFLAGS="$(CGO_LDFLAGS)" CPATH="$(CPATH):$(CURDIR)/sources/onnxruntime/include/" LIBRARY_PATH=$(CURDIR)/backend-assets/lib \
|
||||||
|
$(GOCMD) build -ldflags "$(LD_FLAGS)" -tags "$(GO_TAGS)" -o backend-assets/grpc/silero-vad ./backend/go/vad/silero
|
||||||
|
ifneq ($(UPX),)
|
||||||
|
$(UPX) backend-assets/grpc/silero-vad
|
||||||
|
endif
|
||||||
|
|
||||||
backend-assets/grpc/tinydream: sources/go-tiny-dream sources/go-tiny-dream/libtinydream.a backend-assets/grpc
|
backend-assets/grpc/tinydream: sources/go-tiny-dream sources/go-tiny-dream/libtinydream.a backend-assets/grpc
|
||||||
CGO_LDFLAGS="$(CGO_LDFLAGS)" LIBRARY_PATH=$(CURDIR)/go-tiny-dream \
|
CGO_LDFLAGS="$(CGO_LDFLAGS)" LIBRARY_PATH=$(CURDIR)/go-tiny-dream \
|
||||||
$(GOCMD) build -ldflags "$(LD_FLAGS)" -tags "$(GO_TAGS)" -o backend-assets/grpc/tinydream ./backend/go/image/tinydream
|
$(GOCMD) build -ldflags "$(LD_FLAGS)" -tags "$(GO_TAGS)" -o backend-assets/grpc/tinydream ./backend/go/image/tinydream
|
||||||
@@ -891,7 +978,7 @@ docker-aio-all:
|
|||||||
|
|
||||||
docker-image-intel:
|
docker-image-intel:
|
||||||
docker build \
|
docker build \
|
||||||
--build-arg BASE_IMAGE=intel/oneapi-basekit:2024.2.0-devel-ubuntu22.04 \
|
--build-arg BASE_IMAGE=intel/oneapi-basekit:2025.0.0-0-devel-ubuntu22.04 \
|
||||||
--build-arg IMAGE_TYPE=$(IMAGE_TYPE) \
|
--build-arg IMAGE_TYPE=$(IMAGE_TYPE) \
|
||||||
--build-arg GO_TAGS="none" \
|
--build-arg GO_TAGS="none" \
|
||||||
--build-arg MAKEFLAGS="$(DOCKER_MAKEFLAGS)" \
|
--build-arg MAKEFLAGS="$(DOCKER_MAKEFLAGS)" \
|
||||||
@@ -899,7 +986,7 @@ docker-image-intel:
|
|||||||
|
|
||||||
docker-image-intel-xpu:
|
docker-image-intel-xpu:
|
||||||
docker build \
|
docker build \
|
||||||
--build-arg BASE_IMAGE=intel/oneapi-basekit:2024.2.0-devel-ubuntu22.04 \
|
--build-arg BASE_IMAGE=intel/oneapi-basekit:2025.0.0-0-devel-ubuntu22.04 \
|
||||||
--build-arg IMAGE_TYPE=$(IMAGE_TYPE) \
|
--build-arg IMAGE_TYPE=$(IMAGE_TYPE) \
|
||||||
--build-arg GO_TAGS="none" \
|
--build-arg GO_TAGS="none" \
|
||||||
--build-arg MAKEFLAGS="$(DOCKER_MAKEFLAGS)" \
|
--build-arg MAKEFLAGS="$(DOCKER_MAKEFLAGS)" \
|
||||||
|
|||||||
31
README.md
31
README.md
@@ -38,9 +38,13 @@
|
|||||||
</a>
|
</a>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<a href="https://trendshift.io/repositories/1484" target="_blank"><img src="https://trendshift.io/api/badge/repositories/1484" alt="go-skynet%2FLocalAI | Trendshift" style="width: 250px; height: 55px;" width="250" height="55"/></a>
|
||||||
|
</p>
|
||||||
|
|
||||||
> :bulb: Get help - [❓FAQ](https://localai.io/faq/) [💭Discussions](https://github.com/go-skynet/LocalAI/discussions) [:speech_balloon: Discord](https://discord.gg/uJAeKSAGDy) [:book: Documentation website](https://localai.io/)
|
> :bulb: Get help - [❓FAQ](https://localai.io/faq/) [💭Discussions](https://github.com/go-skynet/LocalAI/discussions) [:speech_balloon: Discord](https://discord.gg/uJAeKSAGDy) [:book: Documentation website](https://localai.io/)
|
||||||
>
|
>
|
||||||
> [💻 Quickstart](https://localai.io/basics/getting_started/) [🖼️ Models](https://models.localai.io/) [🚀 Roadmap](https://github.com/mudler/LocalAI/issues?q=is%3Aissue+is%3Aopen+label%3Aroadmap) [🥽 Demo](https://demo.localai.io) [🌍 Explorer](https://explorer.localai.io) [🛫 Examples](https://github.com/go-skynet/LocalAI/tree/master/examples/)
|
> [💻 Quickstart](https://localai.io/basics/getting_started/) [🖼️ Models](https://models.localai.io/) [🚀 Roadmap](https://github.com/mudler/LocalAI/issues?q=is%3Aissue+is%3Aopen+label%3Aroadmap) [🥽 Demo](https://demo.localai.io) [🌍 Explorer](https://explorer.localai.io) [🛫 Examples](https://github.com/mudler/LocalAI-examples)
|
||||||
|
|
||||||
[](https://github.com/go-skynet/LocalAI/actions/workflows/test.yml)[](https://github.com/go-skynet/LocalAI/actions/workflows/release.yaml)[](https://github.com/go-skynet/LocalAI/actions/workflows/image.yml)[](https://github.com/go-skynet/LocalAI/actions/workflows/bump_deps.yaml)[](https://artifacthub.io/packages/search?repo=localai)
|
[](https://github.com/go-skynet/LocalAI/actions/workflows/test.yml)[](https://github.com/go-skynet/LocalAI/actions/workflows/release.yaml)[](https://github.com/go-skynet/LocalAI/actions/workflows/image.yml)[](https://github.com/go-skynet/LocalAI/actions/workflows/bump_deps.yaml)[](https://artifacthub.io/packages/search?repo=localai)
|
||||||
|
|
||||||
@@ -56,14 +60,17 @@ curl https://localai.io/install.sh | sh
|
|||||||
|
|
||||||
Or run with docker:
|
Or run with docker:
|
||||||
```bash
|
```bash
|
||||||
|
# CPU only image:
|
||||||
|
docker run -ti --name local-ai -p 8080:8080 localai/localai:latest-cpu
|
||||||
|
|
||||||
|
# Nvidia GPU:
|
||||||
|
docker run -ti --name local-ai -p 8080:8080 --gpus all localai/localai:latest-gpu-nvidia-cuda-12
|
||||||
|
|
||||||
|
# CPU and GPU image (bigger size):
|
||||||
|
docker run -ti --name local-ai -p 8080:8080 localai/localai:latest
|
||||||
|
|
||||||
|
# AIO images (it will pre-download a set of models ready for use, see https://localai.io/basics/container/)
|
||||||
docker run -ti --name local-ai -p 8080:8080 localai/localai:latest-aio-cpu
|
docker run -ti --name local-ai -p 8080:8080 localai/localai:latest-aio-cpu
|
||||||
# Alternative images:
|
|
||||||
# - if you have an Nvidia GPU:
|
|
||||||
# docker run -ti --name local-ai -p 8080:8080 --gpus all localai/localai:latest-aio-gpu-nvidia-cuda-12
|
|
||||||
# - without preconfigured models
|
|
||||||
# docker run -ti --name local-ai -p 8080:8080 localai/localai:latest
|
|
||||||
# - without preconfigured models for Nvidia GPUs
|
|
||||||
# docker run -ti --name local-ai -p 8080:8080 --gpus all localai/localai:latest-gpu-nvidia-cuda-12
|
|
||||||
```
|
```
|
||||||
|
|
||||||
To load models:
|
To load models:
|
||||||
@@ -85,6 +92,10 @@ local-ai run oci://localai/phi-2:latest
|
|||||||
|
|
||||||
## 📰 Latest project news
|
## 📰 Latest project news
|
||||||
|
|
||||||
|
- Dec 2024: stablediffusion.cpp backend (ggml) added ( https://github.com/mudler/LocalAI/pull/4289 )
|
||||||
|
- Nov 2024: Bark.cpp backend added ( https://github.com/mudler/LocalAI/pull/4287 )
|
||||||
|
- Nov 2024: Voice activity detection models (**VAD**) added to the API: https://github.com/mudler/LocalAI/pull/4204
|
||||||
|
- Oct 2024: examples moved to [LocalAI-examples](https://github.com/mudler/LocalAI-examples)
|
||||||
- Aug 2024: 🆕 FLUX-1, [P2P Explorer](https://explorer.localai.io)
|
- Aug 2024: 🆕 FLUX-1, [P2P Explorer](https://explorer.localai.io)
|
||||||
- July 2024: 🔥🔥 🆕 P2P Dashboard, LocalAI Federated mode and AI Swarms: https://github.com/mudler/LocalAI/pull/2723
|
- July 2024: 🔥🔥 🆕 P2P Dashboard, LocalAI Federated mode and AI Swarms: https://github.com/mudler/LocalAI/pull/2723
|
||||||
- June 2024: 🆕 You can browse now the model gallery without LocalAI! Check out https://models.localai.io
|
- June 2024: 🆕 You can browse now the model gallery without LocalAI! Check out https://models.localai.io
|
||||||
@@ -155,6 +166,9 @@ Other:
|
|||||||
- Slack bot https://github.com/mudler/LocalAGI/tree/main/examples/slack
|
- Slack bot https://github.com/mudler/LocalAGI/tree/main/examples/slack
|
||||||
- Shell-Pilot(Interact with LLM using LocalAI models via pure shell scripts on your Linux or MacOS system) https://github.com/reid41/shell-pilot
|
- Shell-Pilot(Interact with LLM using LocalAI models via pure shell scripts on your Linux or MacOS system) https://github.com/reid41/shell-pilot
|
||||||
- Telegram bot https://github.com/mudler/LocalAI/tree/master/examples/telegram-bot
|
- Telegram bot https://github.com/mudler/LocalAI/tree/master/examples/telegram-bot
|
||||||
|
- Another Telegram Bot https://github.com/JackBekket/Hellper
|
||||||
|
- Auto-documentation https://github.com/JackBekket/Reflexia
|
||||||
|
- Github bot which answer on issues, with code and documentation as context https://github.com/JackBekket/GitHelper
|
||||||
- Github Actions: https://github.com/marketplace/actions/start-localai
|
- Github Actions: https://github.com/marketplace/actions/start-localai
|
||||||
- Examples: https://github.com/mudler/LocalAI/tree/master/examples/
|
- Examples: https://github.com/mudler/LocalAI/tree/master/examples/
|
||||||
|
|
||||||
@@ -229,7 +243,6 @@ LocalAI couldn't have been built without the help of great software already avai
|
|||||||
- https://github.com/antimatter15/alpaca.cpp
|
- https://github.com/antimatter15/alpaca.cpp
|
||||||
- https://github.com/EdVince/Stable-Diffusion-NCNN
|
- https://github.com/EdVince/Stable-Diffusion-NCNN
|
||||||
- https://github.com/ggerganov/whisper.cpp
|
- https://github.com/ggerganov/whisper.cpp
|
||||||
- https://github.com/saharNooby/rwkv.cpp
|
|
||||||
- https://github.com/rhasspy/piper
|
- https://github.com/rhasspy/piper
|
||||||
|
|
||||||
## 🤗 Contributors
|
## 🤗 Contributors
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
name: text-embedding-ada-002
|
name: text-embedding-ada-002
|
||||||
backend: bert-embeddings
|
embeddings: true
|
||||||
parameters:
|
parameters:
|
||||||
model: huggingface://mudler/all-MiniLM-L6-v2/ggml-model-q4_0.bin
|
model: huggingface://hugging-quants/Llama-3.2-1B-Instruct-Q4_K_M-GGUF/llama-3.2-1b-instruct-q4_k_m.gguf
|
||||||
|
|
||||||
usage: |
|
usage: |
|
||||||
You can test this model with curl like this:
|
You can test this model with curl like this:
|
||||||
|
|||||||
@@ -28,6 +28,8 @@ service Backend {
|
|||||||
rpc Rerank(RerankRequest) returns (RerankResult) {}
|
rpc Rerank(RerankRequest) returns (RerankResult) {}
|
||||||
|
|
||||||
rpc GetMetrics(MetricsRequest) returns (MetricsResponse);
|
rpc GetMetrics(MetricsRequest) returns (MetricsResponse);
|
||||||
|
|
||||||
|
rpc VAD(VADRequest) returns (VADResponse) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Define the empty request
|
// Define the empty request
|
||||||
@@ -219,6 +221,7 @@ message ModelOptions {
|
|||||||
int32 SwapSpace = 53;
|
int32 SwapSpace = 53;
|
||||||
int32 MaxModelLen = 54;
|
int32 MaxModelLen = 54;
|
||||||
int32 TensorParallelSize = 55;
|
int32 TensorParallelSize = 55;
|
||||||
|
string LoadFormat = 58;
|
||||||
|
|
||||||
string MMProj = 41;
|
string MMProj = 41;
|
||||||
|
|
||||||
@@ -232,6 +235,16 @@ message ModelOptions {
|
|||||||
|
|
||||||
bool FlashAttention = 56;
|
bool FlashAttention = 56;
|
||||||
bool NoKVOffload = 57;
|
bool NoKVOffload = 57;
|
||||||
|
|
||||||
|
string ModelPath = 59;
|
||||||
|
|
||||||
|
repeated string LoraAdapters = 60;
|
||||||
|
repeated float LoraScales = 61;
|
||||||
|
|
||||||
|
repeated string Options = 62;
|
||||||
|
|
||||||
|
string CacheTypeKey = 63;
|
||||||
|
string CacheTypeValue = 64;
|
||||||
}
|
}
|
||||||
|
|
||||||
message Result {
|
message Result {
|
||||||
@@ -287,6 +300,19 @@ message TTSRequest {
|
|||||||
optional string language = 5;
|
optional string language = 5;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
message VADRequest {
|
||||||
|
repeated float audio = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
message VADSegment {
|
||||||
|
float start = 1;
|
||||||
|
float end = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
message VADResponse {
|
||||||
|
repeated VADSegment segments = 1;
|
||||||
|
}
|
||||||
|
|
||||||
message SoundGenerationRequest {
|
message SoundGenerationRequest {
|
||||||
string text = 1;
|
string text = 1;
|
||||||
string model = 2;
|
string model = 2;
|
||||||
|
|||||||
@@ -7,44 +7,6 @@ BUILD_TYPE?=
|
|||||||
ONEAPI_VARS?=/opt/intel/oneapi/setvars.sh
|
ONEAPI_VARS?=/opt/intel/oneapi/setvars.sh
|
||||||
TARGET?=--target grpc-server
|
TARGET?=--target grpc-server
|
||||||
|
|
||||||
# Disable Shared libs as we are linking on static gRPC and we can't mix shared and static
|
|
||||||
CMAKE_ARGS+=-DBUILD_SHARED_LIBS=OFF
|
|
||||||
|
|
||||||
# If build type is cublas, then we set -DGGML_CUDA=ON to CMAKE_ARGS automatically
|
|
||||||
ifeq ($(BUILD_TYPE),cublas)
|
|
||||||
CMAKE_ARGS+=-DGGML_CUDA=ON
|
|
||||||
# If build type is openblas then we set -DGGML_BLAS=ON -DGGML_BLAS_VENDOR=OpenBLAS
|
|
||||||
# to CMAKE_ARGS automatically
|
|
||||||
else ifeq ($(BUILD_TYPE),openblas)
|
|
||||||
CMAKE_ARGS+=-DGGML_BLAS=ON -DGGML_BLAS_VENDOR=OpenBLAS
|
|
||||||
# If build type is clblas (openCL) we set -DGGML_CLBLAST=ON -DCLBlast_DIR=/some/path
|
|
||||||
else ifeq ($(BUILD_TYPE),clblas)
|
|
||||||
CMAKE_ARGS+=-DGGML_CLBLAST=ON -DCLBlast_DIR=/some/path
|
|
||||||
# If it's hipblas we do have also to set CC=/opt/rocm/llvm/bin/clang CXX=/opt/rocm/llvm/bin/clang++
|
|
||||||
else ifeq ($(BUILD_TYPE),hipblas)
|
|
||||||
CMAKE_ARGS+=-DGGML_HIPBLAS=ON
|
|
||||||
# If it's OSX, DO NOT embed the metal library - -DGGML_METAL_EMBED_LIBRARY=ON requires further investigation
|
|
||||||
# But if it's OSX without metal, disable it here
|
|
||||||
else ifeq ($(OS),Darwin)
|
|
||||||
ifneq ($(BUILD_TYPE),metal)
|
|
||||||
CMAKE_ARGS+=-DGGML_METAL=OFF
|
|
||||||
else
|
|
||||||
CMAKE_ARGS+=-DGGML_METAL=ON
|
|
||||||
# Until this is tested properly, we disable embedded metal file
|
|
||||||
# as we already embed it as part of the LocalAI assets
|
|
||||||
CMAKE_ARGS+=-DGGML_METAL_EMBED_LIBRARY=OFF
|
|
||||||
TARGET+=--target ggml-metal
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(BUILD_TYPE),sycl_f16)
|
|
||||||
CMAKE_ARGS+=-DGGML_SYCL=ON -DCMAKE_C_COMPILER=icx -DCMAKE_CXX_COMPILER=icpx -DGGML_SYCL_F16=ON
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(BUILD_TYPE),sycl_f32)
|
|
||||||
CMAKE_ARGS+=-DGGML_SYCL=ON -DCMAKE_C_COMPILER=icx -DCMAKE_CXX_COMPILER=icpx
|
|
||||||
endif
|
|
||||||
|
|
||||||
llama.cpp:
|
llama.cpp:
|
||||||
mkdir -p llama.cpp
|
mkdir -p llama.cpp
|
||||||
cd llama.cpp && \
|
cd llama.cpp && \
|
||||||
@@ -72,7 +34,7 @@ clean: purge
|
|||||||
rm -rf llama.cpp
|
rm -rf llama.cpp
|
||||||
|
|
||||||
grpc-server: llama.cpp llama.cpp/examples/grpc-server
|
grpc-server: llama.cpp llama.cpp/examples/grpc-server
|
||||||
@echo "Building grpc-server with $(BUILD_TYPE) build type and $(CMAKE_ARGS)"
|
@echo "Building grpc-server for llama.cpp with $(BUILD_TYPE) build type and $(CMAKE_ARGS)"
|
||||||
ifneq (,$(findstring sycl,$(BUILD_TYPE)))
|
ifneq (,$(findstring sycl,$(BUILD_TYPE)))
|
||||||
+bash -c "source $(ONEAPI_VARS); \
|
+bash -c "source $(ONEAPI_VARS); \
|
||||||
cd llama.cpp && mkdir -p build && cd build && cmake .. $(CMAKE_ARGS) && cmake --build . --config Release $(TARGET)"
|
cd llama.cpp && mkdir -p build && cd build && cmake .. $(CMAKE_ARGS) && cmake --build . --config Release $(TARGET)"
|
||||||
|
|||||||
@@ -203,7 +203,7 @@ struct llama_client_slot
|
|||||||
std::string stopping_word;
|
std::string stopping_word;
|
||||||
|
|
||||||
// sampling
|
// sampling
|
||||||
struct common_sampler_params sparams;
|
struct common_params_sampling sparams;
|
||||||
common_sampler *ctx_sampling = nullptr;
|
common_sampler *ctx_sampling = nullptr;
|
||||||
|
|
||||||
int32_t ga_i = 0; // group-attention state
|
int32_t ga_i = 0; // group-attention state
|
||||||
@@ -662,7 +662,7 @@ struct llama_server_context
|
|||||||
|
|
||||||
bool launch_slot_with_data(llama_client_slot* &slot, json data) {
|
bool launch_slot_with_data(llama_client_slot* &slot, json data) {
|
||||||
slot_params default_params;
|
slot_params default_params;
|
||||||
common_sampler_params default_sparams;
|
common_params_sampling default_sparams;
|
||||||
|
|
||||||
slot->params.stream = json_value(data, "stream", false);
|
slot->params.stream = json_value(data, "stream", false);
|
||||||
slot->params.cache_prompt = json_value(data, "cache_prompt", false);
|
slot->params.cache_prompt = json_value(data, "cache_prompt", false);
|
||||||
@@ -670,7 +670,6 @@ struct llama_server_context
|
|||||||
slot->sparams.top_k = json_value(data, "top_k", default_sparams.top_k);
|
slot->sparams.top_k = json_value(data, "top_k", default_sparams.top_k);
|
||||||
slot->sparams.top_p = json_value(data, "top_p", default_sparams.top_p);
|
slot->sparams.top_p = json_value(data, "top_p", default_sparams.top_p);
|
||||||
slot->sparams.min_p = json_value(data, "min_p", default_sparams.min_p);
|
slot->sparams.min_p = json_value(data, "min_p", default_sparams.min_p);
|
||||||
slot->sparams.tfs_z = json_value(data, "tfs_z", default_sparams.tfs_z);
|
|
||||||
slot->sparams.typ_p = json_value(data, "typical_p", default_sparams.typ_p);
|
slot->sparams.typ_p = json_value(data, "typical_p", default_sparams.typ_p);
|
||||||
slot->sparams.temp = json_value(data, "temperature", default_sparams.temp);
|
slot->sparams.temp = json_value(data, "temperature", default_sparams.temp);
|
||||||
slot->sparams.dynatemp_range = json_value(data, "dynatemp_range", default_sparams.dynatemp_range);
|
slot->sparams.dynatemp_range = json_value(data, "dynatemp_range", default_sparams.dynatemp_range);
|
||||||
@@ -1206,7 +1205,6 @@ struct llama_server_context
|
|||||||
{"top_k", slot.sparams.top_k},
|
{"top_k", slot.sparams.top_k},
|
||||||
{"top_p", slot.sparams.top_p},
|
{"top_p", slot.sparams.top_p},
|
||||||
{"min_p", slot.sparams.min_p},
|
{"min_p", slot.sparams.min_p},
|
||||||
{"tfs_z", slot.sparams.tfs_z},
|
|
||||||
{"typical_p", slot.sparams.typ_p},
|
{"typical_p", slot.sparams.typ_p},
|
||||||
{"repeat_last_n", slot.sparams.penalty_last_n},
|
{"repeat_last_n", slot.sparams.penalty_last_n},
|
||||||
{"repeat_penalty", slot.sparams.penalty_repeat},
|
{"repeat_penalty", slot.sparams.penalty_repeat},
|
||||||
@@ -2105,7 +2103,6 @@ json parse_options(bool streaming, const backend::PredictOptions* predict, llama
|
|||||||
// slot->params.n_predict = json_value(data, "n_predict", default_params.n_predict);
|
// slot->params.n_predict = json_value(data, "n_predict", default_params.n_predict);
|
||||||
// slot->sparams.top_k = json_value(data, "top_k", default_sparams.top_k);
|
// slot->sparams.top_k = json_value(data, "top_k", default_sparams.top_k);
|
||||||
// slot->sparams.top_p = json_value(data, "top_p", default_sparams.top_p);
|
// slot->sparams.top_p = json_value(data, "top_p", default_sparams.top_p);
|
||||||
// slot->sparams.tfs_z = json_value(data, "tfs_z", default_sparams.tfs_z);
|
|
||||||
// slot->sparams.typical_p = json_value(data, "typical_p", default_sparams.typical_p);
|
// slot->sparams.typical_p = json_value(data, "typical_p", default_sparams.typical_p);
|
||||||
// slot->sparams.temp = json_value(data, "temperature", default_sparams.temp);
|
// slot->sparams.temp = json_value(data, "temperature", default_sparams.temp);
|
||||||
// slot->sparams.penalty_last_n = json_value(data, "repeat_last_n", default_sparams.penalty_last_n);
|
// slot->sparams.penalty_last_n = json_value(data, "repeat_last_n", default_sparams.penalty_last_n);
|
||||||
@@ -2129,7 +2126,6 @@ json parse_options(bool streaming, const backend::PredictOptions* predict, llama
|
|||||||
data["n_predict"] = predict->tokens() == 0 ? -1 : predict->tokens();
|
data["n_predict"] = predict->tokens() == 0 ? -1 : predict->tokens();
|
||||||
data["top_k"] = predict->topk();
|
data["top_k"] = predict->topk();
|
||||||
data["top_p"] = predict->topp();
|
data["top_p"] = predict->topp();
|
||||||
data["tfs_z"] = predict->tailfreesamplingz();
|
|
||||||
data["typical_p"] = predict->typicalp();
|
data["typical_p"] = predict->typicalp();
|
||||||
data["temperature"] = predict->temperature();
|
data["temperature"] = predict->temperature();
|
||||||
data["repeat_last_n"] = predict->repeat();
|
data["repeat_last_n"] = predict->repeat();
|
||||||
@@ -2176,7 +2172,6 @@ json parse_options(bool streaming, const backend::PredictOptions* predict, llama
|
|||||||
// llama.params.n_predict = predict->tokens() == 0 ? -1 : predict->tokens();
|
// llama.params.n_predict = predict->tokens() == 0 ? -1 : predict->tokens();
|
||||||
// llama.params.sparams.top_k = predict->topk();
|
// llama.params.sparams.top_k = predict->topk();
|
||||||
// llama.params.sparams.top_p = predict->topp();
|
// llama.params.sparams.top_p = predict->topp();
|
||||||
// llama.params.sparams.tfs_z = predict->tailfreesamplingz();
|
|
||||||
// llama.params.sparams.typical_p = predict->typicalp();
|
// llama.params.sparams.typical_p = predict->typicalp();
|
||||||
// llama.params.sparams.penalty_last_n = predict->repeat();
|
// llama.params.sparams.penalty_last_n = predict->repeat();
|
||||||
// llama.params.sparams.temp = predict->temperature();
|
// llama.params.sparams.temp = predict->temperature();
|
||||||
@@ -2246,6 +2241,12 @@ static void params_parse(const backend::ModelOptions* request,
|
|||||||
}
|
}
|
||||||
// params.model_alias ??
|
// params.model_alias ??
|
||||||
params.model_alias = request->modelfile();
|
params.model_alias = request->modelfile();
|
||||||
|
if (!request->cachetypekey().empty()) {
|
||||||
|
params.cache_type_k = request->cachetypekey();
|
||||||
|
}
|
||||||
|
if (!request->cachetypevalue().empty()) {
|
||||||
|
params.cache_type_v = request->cachetypevalue();
|
||||||
|
}
|
||||||
params.n_ctx = request->contextsize();
|
params.n_ctx = request->contextsize();
|
||||||
//params.memory_f16 = request->f16memory();
|
//params.memory_f16 = request->f16memory();
|
||||||
params.cpuparams.n_threads = request->threads();
|
params.cpuparams.n_threads = request->threads();
|
||||||
@@ -2304,6 +2305,7 @@ static void params_parse(const backend::ModelOptions* request,
|
|||||||
params.use_mmap = request->mmap();
|
params.use_mmap = request->mmap();
|
||||||
params.flash_attn = request->flashattention();
|
params.flash_attn = request->flashattention();
|
||||||
params.no_kv_offload = request->nokvoffload();
|
params.no_kv_offload = request->nokvoffload();
|
||||||
|
params.ctx_shift = false; // We control context-shifting in any case (and we disable it as it could just lead to infinite loops)
|
||||||
|
|
||||||
params.embedding = request->embeddings();
|
params.embedding = request->embeddings();
|
||||||
|
|
||||||
|
|||||||
25
backend/go/bark/Makefile
Normal file
25
backend/go/bark/Makefile
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
INCLUDE_PATH := $(abspath ./)
|
||||||
|
LIBRARY_PATH := $(abspath ./)
|
||||||
|
|
||||||
|
AR?=ar
|
||||||
|
|
||||||
|
BUILD_TYPE?=
|
||||||
|
# keep standard at C11 and C++11
|
||||||
|
CXXFLAGS = -I. -I$(INCLUDE_PATH)/../../../sources/bark.cpp/examples -I$(INCLUDE_PATH)/../../../sources/bark.cpp/spm-headers -I$(INCLUDE_PATH)/../../../sources/bark.cpp -O3 -DNDEBUG -std=c++17 -fPIC
|
||||||
|
LDFLAGS = -L$(LIBRARY_PATH) -L$(LIBRARY_PATH)/../../../sources/bark.cpp/build/examples -lbark -lstdc++ -lm
|
||||||
|
|
||||||
|
# warnings
|
||||||
|
CXXFLAGS += -Wall -Wextra -Wpedantic -Wcast-qual -Wno-unused-function
|
||||||
|
|
||||||
|
gobark.o:
|
||||||
|
$(CXX) $(CXXFLAGS) gobark.cpp -o gobark.o -c $(LDFLAGS)
|
||||||
|
|
||||||
|
libbark.a: gobark.o
|
||||||
|
cp $(INCLUDE_PATH)/../../../sources/bark.cpp/build/libbark.a ./
|
||||||
|
$(AR) rcs libbark.a gobark.o
|
||||||
|
$(AR) rcs libbark.a $(LIBRARY_PATH)/../../../sources/bark.cpp/build/encodec.cpp/ggml/src/CMakeFiles/ggml.dir/ggml.c.o
|
||||||
|
$(AR) rcs libbark.a $(LIBRARY_PATH)/../../../sources/bark.cpp/build/encodec.cpp/ggml/src/CMakeFiles/ggml.dir/ggml-alloc.c.o
|
||||||
|
$(AR) rcs libbark.a $(LIBRARY_PATH)/../../../sources/bark.cpp/build/encodec.cpp/ggml/src/CMakeFiles/ggml.dir/ggml-backend.c.o
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f gobark.o libbark.a
|
||||||
85
backend/go/bark/gobark.cpp
Normal file
85
backend/go/bark/gobark.cpp
Normal file
@@ -0,0 +1,85 @@
|
|||||||
|
#include <iostream>
|
||||||
|
#include <tuple>
|
||||||
|
|
||||||
|
#include "bark.h"
|
||||||
|
#include "gobark.h"
|
||||||
|
#include "common.h"
|
||||||
|
#include "ggml.h"
|
||||||
|
|
||||||
|
struct bark_context *c;
|
||||||
|
|
||||||
|
void bark_print_progress_callback(struct bark_context *bctx, enum bark_encoding_step step, int progress, void *user_data) {
|
||||||
|
if (step == bark_encoding_step::SEMANTIC) {
|
||||||
|
printf("\rGenerating semantic tokens... %d%%", progress);
|
||||||
|
} else if (step == bark_encoding_step::COARSE) {
|
||||||
|
printf("\rGenerating coarse tokens... %d%%", progress);
|
||||||
|
} else if (step == bark_encoding_step::FINE) {
|
||||||
|
printf("\rGenerating fine tokens... %d%%", progress);
|
||||||
|
}
|
||||||
|
fflush(stdout);
|
||||||
|
}
|
||||||
|
|
||||||
|
int load_model(char *model) {
|
||||||
|
// initialize bark context
|
||||||
|
struct bark_context_params ctx_params = bark_context_default_params();
|
||||||
|
bark_params params;
|
||||||
|
|
||||||
|
params.model_path = model;
|
||||||
|
|
||||||
|
// ctx_params.verbosity = verbosity;
|
||||||
|
ctx_params.progress_callback = bark_print_progress_callback;
|
||||||
|
ctx_params.progress_callback_user_data = nullptr;
|
||||||
|
|
||||||
|
struct bark_context *bctx = bark_load_model(params.model_path.c_str(), ctx_params, params.seed);
|
||||||
|
if (!bctx) {
|
||||||
|
fprintf(stderr, "%s: Could not load model\n", __func__);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
c = bctx;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int tts(char *text,int threads, char *dst ) {
|
||||||
|
|
||||||
|
ggml_time_init();
|
||||||
|
const int64_t t_main_start_us = ggml_time_us();
|
||||||
|
|
||||||
|
// generate audio
|
||||||
|
if (!bark_generate_audio(c, text, threads)) {
|
||||||
|
fprintf(stderr, "%s: An error occured. If the problem persists, feel free to open an issue to report it.\n", __func__);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
const float *audio_data = bark_get_audio_data(c);
|
||||||
|
if (audio_data == NULL) {
|
||||||
|
fprintf(stderr, "%s: Could not get audio data\n", __func__);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
const int audio_arr_size = bark_get_audio_data_size(c);
|
||||||
|
|
||||||
|
std::vector<float> audio_arr(audio_data, audio_data + audio_arr_size);
|
||||||
|
|
||||||
|
write_wav_on_disk(audio_arr, dst);
|
||||||
|
|
||||||
|
// report timing
|
||||||
|
{
|
||||||
|
const int64_t t_main_end_us = ggml_time_us();
|
||||||
|
const int64_t t_load_us = bark_get_load_time(c);
|
||||||
|
const int64_t t_eval_us = bark_get_eval_time(c);
|
||||||
|
|
||||||
|
printf("\n\n");
|
||||||
|
printf("%s: load time = %8.2f ms\n", __func__, t_load_us / 1000.0f);
|
||||||
|
printf("%s: eval time = %8.2f ms\n", __func__, t_eval_us / 1000.0f);
|
||||||
|
printf("%s: total time = %8.2f ms\n", __func__, (t_main_end_us - t_main_start_us) / 1000.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int unload() {
|
||||||
|
bark_free(c);
|
||||||
|
}
|
||||||
|
|
||||||
52
backend/go/bark/gobark.go
Normal file
52
backend/go/bark/gobark.go
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
// #cgo CXXFLAGS: -I${SRCDIR}/../../../sources/bark.cpp/ -I${SRCDIR}/../../../sources/bark.cpp/encodec.cpp -I${SRCDIR}/../../../sources/bark.cpp/examples -I${SRCDIR}/../../../sources/bark.cpp/spm-headers
|
||||||
|
// #cgo LDFLAGS: -L${SRCDIR}/ -L${SRCDIR}/../../../sources/bark.cpp/build/examples -L${SRCDIR}/../../../sources/bark.cpp/build/encodec.cpp/ -lbark -lencodec -lcommon
|
||||||
|
// #include <gobark.h>
|
||||||
|
// #include <stdlib.h>
|
||||||
|
import "C"
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"unsafe"
|
||||||
|
|
||||||
|
"github.com/mudler/LocalAI/pkg/grpc/base"
|
||||||
|
pb "github.com/mudler/LocalAI/pkg/grpc/proto"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Bark struct {
|
||||||
|
base.SingleThread
|
||||||
|
threads int
|
||||||
|
}
|
||||||
|
|
||||||
|
func (sd *Bark) Load(opts *pb.ModelOptions) error {
|
||||||
|
|
||||||
|
sd.threads = int(opts.Threads)
|
||||||
|
|
||||||
|
modelFile := C.CString(opts.ModelFile)
|
||||||
|
defer C.free(unsafe.Pointer(modelFile))
|
||||||
|
|
||||||
|
ret := C.load_model(modelFile)
|
||||||
|
if ret != 0 {
|
||||||
|
return fmt.Errorf("inference failed")
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (sd *Bark) TTS(opts *pb.TTSRequest) error {
|
||||||
|
t := C.CString(opts.Text)
|
||||||
|
defer C.free(unsafe.Pointer(t))
|
||||||
|
|
||||||
|
dst := C.CString(opts.Dst)
|
||||||
|
defer C.free(unsafe.Pointer(dst))
|
||||||
|
|
||||||
|
threads := C.int(sd.threads)
|
||||||
|
|
||||||
|
ret := C.tts(t, threads, dst)
|
||||||
|
if ret != 0 {
|
||||||
|
return fmt.Errorf("inference failed")
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
8
backend/go/bark/gobark.h
Normal file
8
backend/go/bark/gobark.h
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
int load_model(char *model);
|
||||||
|
int tts(char *text,int threads, char *dst );
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
@@ -1,7 +1,6 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
// Note: this is started internally by LocalAI and a server is allocated for each model
|
// Note: this is started internally by LocalAI and a server is allocated for each model
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"flag"
|
"flag"
|
||||||
|
|
||||||
@@ -15,7 +14,7 @@ var (
|
|||||||
func main() {
|
func main() {
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
|
|
||||||
if err := grpc.StartServer(*addr, &Embeddings{}); err != nil {
|
if err := grpc.StartServer(*addr, &Bark{}); err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
21
backend/go/image/stablediffusion-ggml/Makefile
Normal file
21
backend/go/image/stablediffusion-ggml/Makefile
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
INCLUDE_PATH := $(abspath ./)
|
||||||
|
LIBRARY_PATH := $(abspath ./)
|
||||||
|
|
||||||
|
AR?=ar
|
||||||
|
|
||||||
|
BUILD_TYPE?=
|
||||||
|
# keep standard at C11 and C++11
|
||||||
|
CXXFLAGS = -I. -I$(INCLUDE_PATH)/../../../../sources/stablediffusion-ggml.cpp/thirdparty -I$(INCLUDE_PATH)/../../../../sources/stablediffusion-ggml.cpp/ggml/include -I$(INCLUDE_PATH)/../../../../sources/stablediffusion-ggml.cpp -O3 -DNDEBUG -std=c++17 -fPIC
|
||||||
|
|
||||||
|
# warnings
|
||||||
|
CXXFLAGS += -Wall -Wextra -Wpedantic -Wcast-qual -Wno-unused-function
|
||||||
|
|
||||||
|
gosd.o:
|
||||||
|
$(CXX) $(CXXFLAGS) gosd.cpp -o gosd.o -c
|
||||||
|
|
||||||
|
libsd.a: gosd.o
|
||||||
|
cp $(INCLUDE_PATH)/../../../../sources/stablediffusion-ggml.cpp/build/libstable-diffusion.a ./libsd.a
|
||||||
|
$(AR) rcs libsd.a gosd.o
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f gosd.o libsd.a
|
||||||
228
backend/go/image/stablediffusion-ggml/gosd.cpp
Normal file
228
backend/go/image/stablediffusion-ggml/gosd.cpp
Normal file
@@ -0,0 +1,228 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <iostream>
|
||||||
|
#include <random>
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
#include "gosd.h"
|
||||||
|
|
||||||
|
// #include "preprocessing.hpp"
|
||||||
|
#include "flux.hpp"
|
||||||
|
#include "stable-diffusion.h"
|
||||||
|
|
||||||
|
#define STB_IMAGE_IMPLEMENTATION
|
||||||
|
#define STB_IMAGE_STATIC
|
||||||
|
#include "stb_image.h"
|
||||||
|
|
||||||
|
#define STB_IMAGE_WRITE_IMPLEMENTATION
|
||||||
|
#define STB_IMAGE_WRITE_STATIC
|
||||||
|
#include "stb_image_write.h"
|
||||||
|
|
||||||
|
#define STB_IMAGE_RESIZE_IMPLEMENTATION
|
||||||
|
#define STB_IMAGE_RESIZE_STATIC
|
||||||
|
#include "stb_image_resize.h"
|
||||||
|
|
||||||
|
// Names of the sampler method, same order as enum sample_method in stable-diffusion.h
|
||||||
|
const char* sample_method_str[] = {
|
||||||
|
"euler_a",
|
||||||
|
"euler",
|
||||||
|
"heun",
|
||||||
|
"dpm2",
|
||||||
|
"dpm++2s_a",
|
||||||
|
"dpm++2m",
|
||||||
|
"dpm++2mv2",
|
||||||
|
"ipndm",
|
||||||
|
"ipndm_v",
|
||||||
|
"lcm",
|
||||||
|
};
|
||||||
|
|
||||||
|
// Names of the sigma schedule overrides, same order as sample_schedule in stable-diffusion.h
|
||||||
|
const char* schedule_str[] = {
|
||||||
|
"default",
|
||||||
|
"discrete",
|
||||||
|
"karras",
|
||||||
|
"exponential",
|
||||||
|
"ays",
|
||||||
|
"gits",
|
||||||
|
};
|
||||||
|
|
||||||
|
sd_ctx_t* sd_c;
|
||||||
|
|
||||||
|
sample_method_t sample_method;
|
||||||
|
|
||||||
|
int load_model(char *model, char* options[], int threads, int diff) {
|
||||||
|
fprintf (stderr, "Loading model!\n");
|
||||||
|
|
||||||
|
char *stableDiffusionModel = "";
|
||||||
|
if (diff == 1 ) {
|
||||||
|
stableDiffusionModel = model;
|
||||||
|
model = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
// decode options. Options are in form optname:optvale, or if booleans only optname.
|
||||||
|
char *clip_l_path = "";
|
||||||
|
char *clip_g_path = "";
|
||||||
|
char *t5xxl_path = "";
|
||||||
|
char *vae_path = "";
|
||||||
|
char *scheduler = "";
|
||||||
|
char *sampler = "";
|
||||||
|
|
||||||
|
// If options is not NULL, parse options
|
||||||
|
for (int i = 0; options[i] != NULL; i++) {
|
||||||
|
char *optname = strtok(options[i], ":");
|
||||||
|
char *optval = strtok(NULL, ":");
|
||||||
|
if (optval == NULL) {
|
||||||
|
optval = "true";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!strcmp(optname, "clip_l_path")) {
|
||||||
|
clip_l_path = optval;
|
||||||
|
}
|
||||||
|
if (!strcmp(optname, "clip_g_path")) {
|
||||||
|
clip_g_path = optval;
|
||||||
|
}
|
||||||
|
if (!strcmp(optname, "t5xxl_path")) {
|
||||||
|
t5xxl_path = optval;
|
||||||
|
}
|
||||||
|
if (!strcmp(optname, "vae_path")) {
|
||||||
|
vae_path = optval;
|
||||||
|
}
|
||||||
|
if (!strcmp(optname, "scheduler")) {
|
||||||
|
scheduler = optval;
|
||||||
|
}
|
||||||
|
if (!strcmp(optname, "sampler")) {
|
||||||
|
sampler = optval;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int sample_method_found = -1;
|
||||||
|
for (int m = 0; m < N_SAMPLE_METHODS; m++) {
|
||||||
|
if (!strcmp(sampler, sample_method_str[m])) {
|
||||||
|
sample_method_found = m;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (sample_method_found == -1) {
|
||||||
|
fprintf(stderr, "Invalid sample method, default to EULER_A!\n");
|
||||||
|
sample_method_found = EULER_A;
|
||||||
|
}
|
||||||
|
sample_method = (sample_method_t)sample_method_found;
|
||||||
|
|
||||||
|
int schedule_found = -1;
|
||||||
|
for (int d = 0; d < N_SCHEDULES; d++) {
|
||||||
|
if (!strcmp(scheduler, schedule_str[d])) {
|
||||||
|
schedule_found = d;
|
||||||
|
fprintf (stderr, "Found scheduler: %s\n", scheduler);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (schedule_found == -1) {
|
||||||
|
fprintf (stderr, "Invalid scheduler! using DEFAULT\n");
|
||||||
|
schedule_found = DEFAULT;
|
||||||
|
}
|
||||||
|
|
||||||
|
schedule_t schedule = (schedule_t)schedule_found;
|
||||||
|
|
||||||
|
fprintf (stderr, "Creating context\n");
|
||||||
|
sd_ctx_t* sd_ctx = new_sd_ctx(model,
|
||||||
|
clip_l_path,
|
||||||
|
clip_g_path,
|
||||||
|
t5xxl_path,
|
||||||
|
stableDiffusionModel,
|
||||||
|
vae_path,
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
threads,
|
||||||
|
SD_TYPE_COUNT,
|
||||||
|
STD_DEFAULT_RNG,
|
||||||
|
schedule,
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
false);
|
||||||
|
|
||||||
|
if (sd_ctx == NULL) {
|
||||||
|
fprintf (stderr, "failed loading model (generic error)\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
fprintf (stderr, "Created context: OK\n");
|
||||||
|
|
||||||
|
sd_c = sd_ctx;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int gen_image(char *text, char *negativeText, int width, int height, int steps, int seed , char *dst, float cfg_scale) {
|
||||||
|
|
||||||
|
sd_image_t* results;
|
||||||
|
|
||||||
|
std::vector<int> skip_layers = {7, 8, 9};
|
||||||
|
|
||||||
|
fprintf (stderr, "Generating image\n");
|
||||||
|
|
||||||
|
results = txt2img(sd_c,
|
||||||
|
text,
|
||||||
|
negativeText,
|
||||||
|
-1, //clip_skip
|
||||||
|
cfg_scale, // sfg_scale
|
||||||
|
3.5f,
|
||||||
|
width,
|
||||||
|
height,
|
||||||
|
sample_method,
|
||||||
|
steps,
|
||||||
|
seed,
|
||||||
|
1,
|
||||||
|
NULL,
|
||||||
|
0.9f,
|
||||||
|
20.f,
|
||||||
|
false,
|
||||||
|
"",
|
||||||
|
skip_layers.data(),
|
||||||
|
skip_layers.size(),
|
||||||
|
0,
|
||||||
|
0.01,
|
||||||
|
0.2);
|
||||||
|
|
||||||
|
if (results == NULL) {
|
||||||
|
fprintf (stderr, "NO results\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (results[0].data == NULL) {
|
||||||
|
fprintf (stderr, "Results with no data\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf (stderr, "Writing PNG\n");
|
||||||
|
|
||||||
|
fprintf (stderr, "DST: %s\n", dst);
|
||||||
|
fprintf (stderr, "Width: %d\n", results[0].width);
|
||||||
|
fprintf (stderr, "Height: %d\n", results[0].height);
|
||||||
|
fprintf (stderr, "Channel: %d\n", results[0].channel);
|
||||||
|
fprintf (stderr, "Data: %p\n", results[0].data);
|
||||||
|
|
||||||
|
stbi_write_png(dst, results[0].width, results[0].height, results[0].channel,
|
||||||
|
results[0].data, 0, NULL);
|
||||||
|
fprintf (stderr, "Saved resulting image to '%s'\n", dst);
|
||||||
|
|
||||||
|
// TODO: free results. Why does it crash?
|
||||||
|
|
||||||
|
free(results[0].data);
|
||||||
|
results[0].data = NULL;
|
||||||
|
free(results);
|
||||||
|
fprintf (stderr, "gen_image is done", dst);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int unload() {
|
||||||
|
free_sd_ctx(sd_c);
|
||||||
|
}
|
||||||
|
|
||||||
96
backend/go/image/stablediffusion-ggml/gosd.go
Normal file
96
backend/go/image/stablediffusion-ggml/gosd.go
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
// #cgo CXXFLAGS: -I${SRCDIR}/../../../../sources/stablediffusion-ggml.cpp/thirdparty -I${SRCDIR}/../../../../sources/stablediffusion-ggml.cpp -I${SRCDIR}/../../../../sources/stablediffusion-ggml.cpp/ggml/include
|
||||||
|
// #cgo LDFLAGS: -L${SRCDIR}/ -L${SRCDIR}/../../../../sources/stablediffusion-ggml.cpp/build/ggml/src/ggml-cpu -L${SRCDIR}/../../../../sources/stablediffusion-ggml.cpp/build/ggml/src -lsd -lstdc++ -lm -lggml -lggml-base -lggml-cpu -lgomp
|
||||||
|
// #include <gosd.h>
|
||||||
|
// #include <stdlib.h>
|
||||||
|
import "C"
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
"strings"
|
||||||
|
"unsafe"
|
||||||
|
|
||||||
|
"github.com/mudler/LocalAI/pkg/grpc/base"
|
||||||
|
pb "github.com/mudler/LocalAI/pkg/grpc/proto"
|
||||||
|
"github.com/mudler/LocalAI/pkg/utils"
|
||||||
|
)
|
||||||
|
|
||||||
|
type SDGGML struct {
|
||||||
|
base.SingleThread
|
||||||
|
threads int
|
||||||
|
sampleMethod string
|
||||||
|
cfgScale float32
|
||||||
|
}
|
||||||
|
|
||||||
|
func (sd *SDGGML) Load(opts *pb.ModelOptions) error {
|
||||||
|
|
||||||
|
sd.threads = int(opts.Threads)
|
||||||
|
|
||||||
|
modelFile := C.CString(opts.ModelFile)
|
||||||
|
defer C.free(unsafe.Pointer(modelFile))
|
||||||
|
|
||||||
|
var options **C.char
|
||||||
|
// prepare the options array to pass to C
|
||||||
|
|
||||||
|
size := C.size_t(unsafe.Sizeof((*C.char)(nil)))
|
||||||
|
length := C.size_t(len(opts.Options))
|
||||||
|
options = (**C.char)(C.malloc(length * size))
|
||||||
|
view := (*[1 << 30]*C.char)(unsafe.Pointer(options))[0:len(opts.Options):len(opts.Options)]
|
||||||
|
|
||||||
|
var diffusionModel int
|
||||||
|
|
||||||
|
var oo []string
|
||||||
|
for _, op := range opts.Options {
|
||||||
|
if op == "diffusion_model" {
|
||||||
|
diffusionModel = 1
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
// If it's an option path, we resolve absolute path from the model path
|
||||||
|
if strings.Contains(op, ":") && strings.Contains(op, "path") {
|
||||||
|
data := strings.Split(op, ":")
|
||||||
|
data[1] = filepath.Join(opts.ModelPath, data[1])
|
||||||
|
if err := utils.VerifyPath(data[1], opts.ModelPath); err == nil {
|
||||||
|
oo = append(oo, strings.Join(data, ":"))
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
oo = append(oo, op)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Fprintf(os.Stderr, "Options: %+v\n", oo)
|
||||||
|
|
||||||
|
for i, x := range oo {
|
||||||
|
view[i] = C.CString(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
sd.cfgScale = opts.CFGScale
|
||||||
|
|
||||||
|
ret := C.load_model(modelFile, options, C.int(opts.Threads), C.int(diffusionModel))
|
||||||
|
if ret != 0 {
|
||||||
|
return fmt.Errorf("could not load model")
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (sd *SDGGML) GenerateImage(opts *pb.GenerateImageRequest) error {
|
||||||
|
t := C.CString(opts.PositivePrompt)
|
||||||
|
defer C.free(unsafe.Pointer(t))
|
||||||
|
|
||||||
|
dst := C.CString(opts.Dst)
|
||||||
|
defer C.free(unsafe.Pointer(dst))
|
||||||
|
|
||||||
|
negative := C.CString(opts.NegativePrompt)
|
||||||
|
defer C.free(unsafe.Pointer(negative))
|
||||||
|
|
||||||
|
ret := C.gen_image(t, negative, C.int(opts.Width), C.int(opts.Height), C.int(opts.Step), C.int(opts.Seed), dst, C.float(sd.cfgScale))
|
||||||
|
if ret != 0 {
|
||||||
|
return fmt.Errorf("inference failed")
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
8
backend/go/image/stablediffusion-ggml/gosd.h
Normal file
8
backend/go/image/stablediffusion-ggml/gosd.h
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
int load_model(char *model, char* options[], int threads, int diffusionModel);
|
||||||
|
int gen_image(char *text, char *negativeText, int width, int height, int steps, int seed, char *dst, float cfg_scale);
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
20
backend/go/image/stablediffusion-ggml/main.go
Normal file
20
backend/go/image/stablediffusion-ggml/main.go
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
// Note: this is started internally by LocalAI and a server is allocated for each model
|
||||||
|
import (
|
||||||
|
"flag"
|
||||||
|
|
||||||
|
grpc "github.com/mudler/LocalAI/pkg/grpc"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
addr = flag.String("addr", "localhost:50051", "the address to connect to")
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
flag.Parse()
|
||||||
|
|
||||||
|
if err := grpc.StartServer(*addr, &SDGGML{}); err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
package main
|
|
||||||
|
|
||||||
// This is a wrapper to statisfy the GRPC service interface
|
|
||||||
// It is meant to be used by the main executable that is the server for the specific backend type (falcon, gpt3, etc)
|
|
||||||
import (
|
|
||||||
bert "github.com/go-skynet/go-bert.cpp"
|
|
||||||
|
|
||||||
"github.com/mudler/LocalAI/pkg/grpc/base"
|
|
||||||
pb "github.com/mudler/LocalAI/pkg/grpc/proto"
|
|
||||||
)
|
|
||||||
|
|
||||||
type Embeddings struct {
|
|
||||||
base.SingleThread
|
|
||||||
bert *bert.Bert
|
|
||||||
}
|
|
||||||
|
|
||||||
func (llm *Embeddings) Load(opts *pb.ModelOptions) error {
|
|
||||||
model, err := bert.New(opts.ModelFile)
|
|
||||||
llm.bert = model
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (llm *Embeddings) Embeddings(opts *pb.PredictOptions) ([]float32, error) {
|
|
||||||
|
|
||||||
if len(opts.EmbeddingTokens) > 0 {
|
|
||||||
tokens := []int{}
|
|
||||||
for _, t := range opts.EmbeddingTokens {
|
|
||||||
tokens = append(tokens, int(t))
|
|
||||||
}
|
|
||||||
return llm.bert.TokenEmbeddings(tokens, bert.SetThreads(int(opts.Threads)))
|
|
||||||
}
|
|
||||||
|
|
||||||
return llm.bert.Embeddings(opts.Embeddings, bert.SetThreads(int(opts.Threads)))
|
|
||||||
}
|
|
||||||
@@ -1,95 +0,0 @@
|
|||||||
package main
|
|
||||||
|
|
||||||
// This is a wrapper to statisfy the GRPC service interface
|
|
||||||
// It is meant to be used by the main executable that is the server for the specific backend type (falcon, gpt3, etc)
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"path/filepath"
|
|
||||||
|
|
||||||
"github.com/donomii/go-rwkv.cpp"
|
|
||||||
"github.com/mudler/LocalAI/pkg/grpc/base"
|
|
||||||
pb "github.com/mudler/LocalAI/pkg/grpc/proto"
|
|
||||||
)
|
|
||||||
|
|
||||||
const tokenizerSuffix = ".tokenizer.json"
|
|
||||||
|
|
||||||
type LLM struct {
|
|
||||||
base.SingleThread
|
|
||||||
|
|
||||||
rwkv *rwkv.RwkvState
|
|
||||||
}
|
|
||||||
|
|
||||||
func (llm *LLM) Load(opts *pb.ModelOptions) error {
|
|
||||||
tokenizerFile := opts.Tokenizer
|
|
||||||
if tokenizerFile == "" {
|
|
||||||
modelFile := filepath.Base(opts.ModelFile)
|
|
||||||
tokenizerFile = modelFile + tokenizerSuffix
|
|
||||||
}
|
|
||||||
modelPath := filepath.Dir(opts.ModelFile)
|
|
||||||
tokenizerPath := filepath.Join(modelPath, tokenizerFile)
|
|
||||||
|
|
||||||
model := rwkv.LoadFiles(opts.ModelFile, tokenizerPath, uint32(opts.GetThreads()))
|
|
||||||
|
|
||||||
if model == nil {
|
|
||||||
return fmt.Errorf("rwkv could not load model")
|
|
||||||
}
|
|
||||||
llm.rwkv = model
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (llm *LLM) Predict(opts *pb.PredictOptions) (string, error) {
|
|
||||||
stopWord := "\n"
|
|
||||||
if len(opts.StopPrompts) > 0 {
|
|
||||||
stopWord = opts.StopPrompts[0]
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := llm.rwkv.ProcessInput(opts.Prompt); err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
|
|
||||||
response := llm.rwkv.GenerateResponse(int(opts.Tokens), stopWord, float32(opts.Temperature), float32(opts.TopP), nil)
|
|
||||||
|
|
||||||
return response, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (llm *LLM) PredictStream(opts *pb.PredictOptions, results chan string) error {
|
|
||||||
go func() {
|
|
||||||
|
|
||||||
stopWord := "\n"
|
|
||||||
if len(opts.StopPrompts) > 0 {
|
|
||||||
stopWord = opts.StopPrompts[0]
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := llm.rwkv.ProcessInput(opts.Prompt); err != nil {
|
|
||||||
fmt.Println("Error processing input: ", err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
llm.rwkv.GenerateResponse(int(opts.Tokens), stopWord, float32(opts.Temperature), float32(opts.TopP), func(s string) bool {
|
|
||||||
results <- s
|
|
||||||
return true
|
|
||||||
})
|
|
||||||
close(results)
|
|
||||||
}()
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (llm *LLM) TokenizeString(opts *pb.PredictOptions) (pb.TokenizationResponse, error) {
|
|
||||||
tokens, err := llm.rwkv.Tokenizer.Encode(opts.Prompt)
|
|
||||||
if err != nil {
|
|
||||||
return pb.TokenizationResponse{}, err
|
|
||||||
}
|
|
||||||
|
|
||||||
l := len(tokens)
|
|
||||||
i32Tokens := make([]int32, l)
|
|
||||||
|
|
||||||
for i, t := range tokens {
|
|
||||||
i32Tokens[i] = int32(t.ID)
|
|
||||||
}
|
|
||||||
|
|
||||||
return pb.TokenizationResponse{
|
|
||||||
Length: int32(l),
|
|
||||||
Tokens: i32Tokens,
|
|
||||||
}, nil
|
|
||||||
}
|
|
||||||
@@ -15,7 +15,7 @@ var (
|
|||||||
func main() {
|
func main() {
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
|
|
||||||
if err := grpc.StartServer(*addr, &LLM{}); err != nil {
|
if err := grpc.StartServer(*addr, &VAD{}); err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
54
backend/go/vad/silero/vad.go
Normal file
54
backend/go/vad/silero/vad.go
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
// This is a wrapper to statisfy the GRPC service interface
|
||||||
|
// It is meant to be used by the main executable that is the server for the specific backend type (falcon, gpt3, etc)
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/mudler/LocalAI/pkg/grpc/base"
|
||||||
|
pb "github.com/mudler/LocalAI/pkg/grpc/proto"
|
||||||
|
"github.com/streamer45/silero-vad-go/speech"
|
||||||
|
)
|
||||||
|
|
||||||
|
type VAD struct {
|
||||||
|
base.SingleThread
|
||||||
|
detector *speech.Detector
|
||||||
|
}
|
||||||
|
|
||||||
|
func (vad *VAD) Load(opts *pb.ModelOptions) error {
|
||||||
|
v, err := speech.NewDetector(speech.DetectorConfig{
|
||||||
|
ModelPath: opts.ModelFile,
|
||||||
|
SampleRate: 16000,
|
||||||
|
//WindowSize: 1024,
|
||||||
|
Threshold: 0.5,
|
||||||
|
MinSilenceDurationMs: 0,
|
||||||
|
SpeechPadMs: 0,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("create silero detector: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
vad.detector = v
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (vad *VAD) VAD(req *pb.VADRequest) (pb.VADResponse, error) {
|
||||||
|
audio := req.Audio
|
||||||
|
|
||||||
|
segments, err := vad.detector.Detect(audio)
|
||||||
|
if err != nil {
|
||||||
|
return pb.VADResponse{}, fmt.Errorf("detect: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
vadSegments := []*pb.VADSegment{}
|
||||||
|
for _, s := range segments {
|
||||||
|
vadSegments = append(vadSegments, &pb.VADSegment{
|
||||||
|
Start: float32(s.SpeechStartAt),
|
||||||
|
End: float32(s.SpeechEndAt),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
return pb.VADResponse{
|
||||||
|
Segments: vadSegments,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
accelerate
|
accelerate
|
||||||
auto-gptq==0.7.1
|
auto-gptq==0.7.1
|
||||||
grpcio==1.67.0
|
grpcio==1.68.1
|
||||||
protobuf
|
protobuf
|
||||||
certifi
|
certifi
|
||||||
transformers
|
transformers
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
bark==0.1.5
|
bark==0.1.5
|
||||||
grpcio==1.67.0
|
grpcio==1.68.1
|
||||||
protobuf
|
protobuf
|
||||||
certifi
|
certifi
|
||||||
@@ -1,8 +1,9 @@
|
|||||||
.DEFAULT_GOAL := install
|
.DEFAULT_GOAL := install
|
||||||
|
|
||||||
.PHONY: install
|
.PHONY: install
|
||||||
install: protogen
|
install:
|
||||||
bash install.sh
|
bash install.sh
|
||||||
|
$(MAKE) protogen
|
||||||
|
|
||||||
.PHONY: protogen
|
.PHONY: protogen
|
||||||
protogen: backend_pb2_grpc.py backend_pb2.py
|
protogen: backend_pb2_grpc.py backend_pb2.py
|
||||||
@@ -12,7 +13,7 @@ protogen-clean:
|
|||||||
$(RM) backend_pb2_grpc.py backend_pb2.py
|
$(RM) backend_pb2_grpc.py backend_pb2.py
|
||||||
|
|
||||||
backend_pb2_grpc.py backend_pb2.py:
|
backend_pb2_grpc.py backend_pb2.py:
|
||||||
python3 -m grpc_tools.protoc -I../.. --python_out=. --grpc_python_out=. backend.proto
|
bash protogen.sh
|
||||||
|
|
||||||
.PHONY: clean
|
.PHONY: clean
|
||||||
clean: protogen-clean
|
clean: protogen-clean
|
||||||
|
|||||||
6
backend/python/common/template/protogen.sh
Normal file
6
backend/python/common/template/protogen.sh
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
|
source $(dirname $0)/../common/libbackend.sh
|
||||||
|
|
||||||
|
python3 -m grpc_tools.protoc -I../.. --python_out=. --grpc_python_out=. backend.proto
|
||||||
@@ -1,2 +1,3 @@
|
|||||||
grpcio==1.67.0
|
grpcio==1.68.1
|
||||||
protobuf
|
protobuf
|
||||||
|
grpcio-tools
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
grpcio==1.67.0
|
grpcio==1.68.1
|
||||||
protobuf
|
protobuf
|
||||||
certifi
|
certifi
|
||||||
packaging==24.1
|
packaging==24.1
|
||||||
@@ -247,11 +247,16 @@ class BackendServicer(backend_pb2_grpc.BackendServicer):
|
|||||||
use_safetensors=True,
|
use_safetensors=True,
|
||||||
variant=variant)
|
variant=variant)
|
||||||
elif request.PipelineType == "FluxPipeline":
|
elif request.PipelineType == "FluxPipeline":
|
||||||
|
if fromSingleFile:
|
||||||
|
self.pipe = FluxPipeline.from_single_file(modelFile,
|
||||||
|
torch_dtype=torchType,
|
||||||
|
use_safetensors=True)
|
||||||
|
else:
|
||||||
self.pipe = FluxPipeline.from_pretrained(
|
self.pipe = FluxPipeline.from_pretrained(
|
||||||
request.Model,
|
request.Model,
|
||||||
torch_dtype=torch.bfloat16)
|
torch_dtype=torch.bfloat16)
|
||||||
if request.LowVRAM:
|
if request.LowVRAM:
|
||||||
self.pipe.enable_model_cpu_offload()
|
self.pipe.enable_model_cpu_offload()
|
||||||
elif request.PipelineType == "FluxTransformer2DModel":
|
elif request.PipelineType == "FluxTransformer2DModel":
|
||||||
dtype = torch.bfloat16
|
dtype = torch.bfloat16
|
||||||
# specify from environment or default to "ChuckMcSneed/FLUX.1-dev"
|
# specify from environment or default to "ChuckMcSneed/FLUX.1-dev"
|
||||||
@@ -296,22 +301,34 @@ class BackendServicer(backend_pb2_grpc.BackendServicer):
|
|||||||
self.pipe.controlnet = self.controlnet
|
self.pipe.controlnet = self.controlnet
|
||||||
else:
|
else:
|
||||||
self.controlnet = None
|
self.controlnet = None
|
||||||
# Assume directory from request.ModelFile.
|
|
||||||
# Only if request.LoraAdapter it's not an absolute path
|
if request.LoraAdapter and not os.path.isabs(request.LoraAdapter):
|
||||||
if request.LoraAdapter and request.ModelFile != "" and not os.path.isabs(request.LoraAdapter) and request.LoraAdapter:
|
|
||||||
# get base path of modelFile
|
|
||||||
modelFileBase = os.path.dirname(request.ModelFile)
|
|
||||||
# modify LoraAdapter to be relative to modelFileBase
|
# modify LoraAdapter to be relative to modelFileBase
|
||||||
request.LoraAdapter = os.path.join(modelFileBase, request.LoraAdapter)
|
request.LoraAdapter = os.path.join(request.ModelPath, request.LoraAdapter)
|
||||||
|
|
||||||
device = "cpu" if not request.CUDA else "cuda"
|
device = "cpu" if not request.CUDA else "cuda"
|
||||||
self.device = device
|
self.device = device
|
||||||
if request.LoraAdapter:
|
if request.LoraAdapter:
|
||||||
# Check if its a local file and not a directory ( we load lora differently for a safetensor file )
|
# Check if its a local file and not a directory ( we load lora differently for a safetensor file )
|
||||||
if os.path.exists(request.LoraAdapter) and not os.path.isdir(request.LoraAdapter):
|
if os.path.exists(request.LoraAdapter) and not os.path.isdir(request.LoraAdapter):
|
||||||
# self.load_lora_weights(request.LoraAdapter, 1, device, torchType)
|
|
||||||
self.pipe.load_lora_weights(request.LoraAdapter)
|
self.pipe.load_lora_weights(request.LoraAdapter)
|
||||||
else:
|
else:
|
||||||
self.pipe.unet.load_attn_procs(request.LoraAdapter)
|
self.pipe.unet.load_attn_procs(request.LoraAdapter)
|
||||||
|
if len(request.LoraAdapters) > 0:
|
||||||
|
i = 0
|
||||||
|
adapters_name = []
|
||||||
|
adapters_weights = []
|
||||||
|
for adapter in request.LoraAdapters:
|
||||||
|
if not os.path.isabs(adapter):
|
||||||
|
adapter = os.path.join(request.ModelPath, adapter)
|
||||||
|
self.pipe.load_lora_weights(adapter, adapter_name=f"adapter_{i}")
|
||||||
|
adapters_name.append(f"adapter_{i}")
|
||||||
|
i += 1
|
||||||
|
|
||||||
|
for adapters_weight in request.LoraScales:
|
||||||
|
adapters_weights.append(adapters_weight)
|
||||||
|
|
||||||
|
self.pipe.set_adapters(adapters_name, adapter_weights=adapters_weights)
|
||||||
|
|
||||||
if request.CUDA:
|
if request.CUDA:
|
||||||
self.pipe.to('cuda')
|
self.pipe.to('cuda')
|
||||||
@@ -392,8 +409,6 @@ class BackendServicer(backend_pb2_grpc.BackendServicer):
|
|||||||
# create a dictionary of values for the parameters
|
# create a dictionary of values for the parameters
|
||||||
options = {
|
options = {
|
||||||
"negative_prompt": request.negative_prompt,
|
"negative_prompt": request.negative_prompt,
|
||||||
"width": request.width,
|
|
||||||
"height": request.height,
|
|
||||||
"num_inference_steps": steps,
|
"num_inference_steps": steps,
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -411,13 +426,13 @@ class BackendServicer(backend_pb2_grpc.BackendServicer):
|
|||||||
keys = options.keys()
|
keys = options.keys()
|
||||||
|
|
||||||
if request.EnableParameters != "":
|
if request.EnableParameters != "":
|
||||||
keys = request.EnableParameters.split(",")
|
keys = [key.strip() for key in request.EnableParameters.split(",")]
|
||||||
|
|
||||||
if request.EnableParameters == "none":
|
if request.EnableParameters == "none":
|
||||||
keys = []
|
keys = []
|
||||||
|
|
||||||
# create a dictionary of parameters by using the keys from EnableParameters and the values from defaults
|
# create a dictionary of parameters by using the keys from EnableParameters and the values from defaults
|
||||||
kwargs = {key: options[key] for key in keys}
|
kwargs = {key: options.get(key) for key in keys if key in options}
|
||||||
|
|
||||||
# Set seed
|
# Set seed
|
||||||
if request.seed > 0:
|
if request.seed > 0:
|
||||||
@@ -428,6 +443,12 @@ class BackendServicer(backend_pb2_grpc.BackendServicer):
|
|||||||
if self.PipelineType == "FluxPipeline":
|
if self.PipelineType == "FluxPipeline":
|
||||||
kwargs["max_sequence_length"] = 256
|
kwargs["max_sequence_length"] = 256
|
||||||
|
|
||||||
|
if request.width:
|
||||||
|
kwargs["width"] = request.width
|
||||||
|
|
||||||
|
if request.height:
|
||||||
|
kwargs["height"] = request.height
|
||||||
|
|
||||||
if self.PipelineType == "FluxTransformer2DModel":
|
if self.PipelineType == "FluxTransformer2DModel":
|
||||||
kwargs["output_type"] = "pil"
|
kwargs["output_type"] = "pil"
|
||||||
kwargs["generator"] = torch.Generator("cpu").manual_seed(0)
|
kwargs["generator"] = torch.Generator("cpu").manual_seed(0)
|
||||||
@@ -447,6 +468,7 @@ class BackendServicer(backend_pb2_grpc.BackendServicer):
|
|||||||
export_to_video(video_frames, request.dst)
|
export_to_video(video_frames, request.dst)
|
||||||
return backend_pb2.Result(message="Media generated successfully", success=True)
|
return backend_pb2.Result(message="Media generated successfully", success=True)
|
||||||
|
|
||||||
|
print(f"Generating image with {kwargs=}", file=sys.stderr)
|
||||||
image = {}
|
image = {}
|
||||||
if COMPEL:
|
if COMPEL:
|
||||||
conditioning, pooled = self.compel.build_conditioning_tensor(prompt)
|
conditioning, pooled = self.compel.build_conditioning_tensor(prompt)
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
setuptools
|
setuptools
|
||||||
grpcio==1.67.0
|
grpcio==1.68.1
|
||||||
pillow
|
pillow
|
||||||
protobuf
|
protobuf
|
||||||
certifi
|
certifi
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
grpcio==1.67.0
|
grpcio==1.68.1
|
||||||
protobuf
|
protobuf
|
||||||
certifi
|
certifi
|
||||||
wheel
|
wheel
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
grpcio==1.67.0
|
grpcio==1.68.1
|
||||||
protobuf
|
protobuf
|
||||||
certifi
|
certifi
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
intel-extension-for-pytorch
|
intel-extension-for-pytorch
|
||||||
torch
|
torch
|
||||||
optimum[openvino]
|
optimum[openvino]
|
||||||
grpcio==1.67.0
|
grpcio==1.68.1
|
||||||
protobuf
|
protobuf
|
||||||
librosa==0.9.1
|
librosa==0.9.1
|
||||||
faster-whisper==0.9.0
|
faster-whisper==0.9.0
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
grpcio==1.67.0
|
grpcio==1.68.1
|
||||||
protobuf
|
protobuf
|
||||||
librosa
|
librosa
|
||||||
faster-whisper
|
faster-whisper
|
||||||
|
|||||||
@@ -12,9 +12,10 @@ export SKIP_CONDA=1
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
.PHONY: parler-tts
|
.PHONY: parler-tts
|
||||||
parler-tts: protogen
|
parler-tts:
|
||||||
@echo "Installing $(CONDA_ENV_PATH)..."
|
@echo "Installing $(CONDA_ENV_PATH)..."
|
||||||
bash install.sh $(CONDA_ENV_PATH)
|
bash install.sh $(CONDA_ENV_PATH)
|
||||||
|
$(MAKE) protogen
|
||||||
|
|
||||||
.PHONY: run
|
.PHONY: run
|
||||||
run: protogen
|
run: protogen
|
||||||
@@ -36,7 +37,7 @@ protogen-clean:
|
|||||||
$(RM) backend_pb2_grpc.py backend_pb2.py
|
$(RM) backend_pb2_grpc.py backend_pb2.py
|
||||||
|
|
||||||
backend_pb2_grpc.py backend_pb2.py:
|
backend_pb2_grpc.py backend_pb2.py:
|
||||||
python3 -m grpc_tools.protoc -I../.. --python_out=. --grpc_python_out=. backend.proto
|
bash protogen.sh
|
||||||
|
|
||||||
.PHONY: clean
|
.PHONY: clean
|
||||||
clean: protogen-clean
|
clean: protogen-clean
|
||||||
|
|||||||
@@ -11,8 +11,10 @@ if [ "x${BUILD_PROFILE}" == "xintel" ]; then
|
|||||||
EXTRA_PIP_INSTALL_FLAGS+=" --upgrade --index-strategy=unsafe-first-match"
|
EXTRA_PIP_INSTALL_FLAGS+=" --upgrade --index-strategy=unsafe-first-match"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
installRequirements
|
installRequirements
|
||||||
|
|
||||||
|
|
||||||
# https://github.com/descriptinc/audiotools/issues/101
|
# https://github.com/descriptinc/audiotools/issues/101
|
||||||
# incompatible protobuf versions.
|
# incompatible protobuf versions.
|
||||||
PYDIR=python3.10
|
PYDIR=python3.10
|
||||||
|
|||||||
6
backend/python/parler-tts/protogen.sh
Executable file
6
backend/python/parler-tts/protogen.sh
Executable file
@@ -0,0 +1,6 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
|
source $(dirname $0)/../common/libbackend.sh
|
||||||
|
|
||||||
|
python3 -m grpc_tools.protoc -I../.. --python_out=. --grpc_python_out=. backend.proto
|
||||||
@@ -1,3 +1,4 @@
|
|||||||
git+https://github.com/huggingface/parler-tts.git@8e465f1b5fcd223478e07175cb40494d19ffbe17
|
git+https://github.com/huggingface/parler-tts.git@8e465f1b5fcd223478e07175cb40494d19ffbe17
|
||||||
llvmlite==0.43.0
|
llvmlite==0.43.0
|
||||||
numba==0.60.0
|
numba==0.60.0
|
||||||
|
grpcio-tools==1.42.0
|
||||||
@@ -1,4 +1,3 @@
|
|||||||
grpcio==1.67.0
|
grpcio==1.68.1
|
||||||
protobuf
|
|
||||||
certifi
|
certifi
|
||||||
llvmlite==0.43.0
|
llvmlite==0.43.0
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
grpcio==1.67.0
|
grpcio==1.68.1
|
||||||
protobuf
|
protobuf
|
||||||
certifi
|
certifi
|
||||||
@@ -2,5 +2,5 @@ torch==2.4.1
|
|||||||
accelerate
|
accelerate
|
||||||
transformers
|
transformers
|
||||||
bitsandbytes
|
bitsandbytes
|
||||||
sentence-transformers==3.2.0
|
sentence-transformers==3.3.1
|
||||||
transformers
|
transformers
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
--extra-index-url https://download.pytorch.org/whl/cu118
|
--extra-index-url https://download.pytorch.org/whl/cu118
|
||||||
torch==2.4.1+cu118
|
torch==2.4.1+cu118
|
||||||
accelerate
|
accelerate
|
||||||
sentence-transformers==3.2.0
|
sentence-transformers==3.3.1
|
||||||
transformers
|
transformers
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
torch==2.4.1
|
torch==2.4.1
|
||||||
accelerate
|
accelerate
|
||||||
sentence-transformers==3.2.0
|
sentence-transformers==3.3.1
|
||||||
transformers
|
transformers
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
--extra-index-url https://download.pytorch.org/whl/rocm6.0
|
--extra-index-url https://download.pytorch.org/whl/rocm6.0
|
||||||
torch==2.4.1+rocm6.0
|
torch==2.4.1+rocm6.0
|
||||||
accelerate
|
accelerate
|
||||||
sentence-transformers==3.2.0
|
sentence-transformers==3.3.1
|
||||||
transformers
|
transformers
|
||||||
@@ -4,5 +4,5 @@ torch
|
|||||||
optimum[openvino]
|
optimum[openvino]
|
||||||
setuptools==69.5.1 # https://github.com/mudler/LocalAI/issues/2406
|
setuptools==69.5.1 # https://github.com/mudler/LocalAI/issues/2406
|
||||||
accelerate
|
accelerate
|
||||||
sentence-transformers==3.2.0
|
sentence-transformers==3.3.1
|
||||||
transformers
|
transformers
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
grpcio==1.67.0
|
grpcio==1.68.1
|
||||||
protobuf
|
protobuf
|
||||||
certifi
|
certifi
|
||||||
datasets
|
datasets
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
grpcio==1.67.0
|
grpcio==1.68.1
|
||||||
protobuf
|
protobuf
|
||||||
scipy==1.14.0
|
scipy==1.14.0
|
||||||
certifi
|
certifi
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
grpcio==1.67.0
|
grpcio==1.68.1
|
||||||
protobuf
|
protobuf
|
||||||
certifi
|
certifi
|
||||||
setuptools==69.5.1 # https://github.com/mudler/LocalAI/issues/2406
|
setuptools==69.5.1 # https://github.com/mudler/LocalAI/issues/2406
|
||||||
@@ -1,3 +1,3 @@
|
|||||||
grpcio==1.67.0
|
grpcio==1.68.1
|
||||||
protobuf
|
protobuf
|
||||||
certifi
|
certifi
|
||||||
@@ -95,6 +95,8 @@ class BackendServicer(backend_pb2_grpc.BackendServicer):
|
|||||||
|
|
||||||
if request.Quantization != "":
|
if request.Quantization != "":
|
||||||
engine_args.quantization = request.Quantization
|
engine_args.quantization = request.Quantization
|
||||||
|
if request.LoadFormat != "":
|
||||||
|
engine_args.load_format = request.LoadFormat
|
||||||
if request.GPUMemoryUtilization != 0:
|
if request.GPUMemoryUtilization != 0:
|
||||||
engine_args.gpu_memory_utilization = request.GPUMemoryUtilization
|
engine_args.gpu_memory_utilization = request.GPUMemoryUtilization
|
||||||
if request.TrustRemoteCode:
|
if request.TrustRemoteCode:
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ if [ "x${BUILD_TYPE}" == "x" ] && [ "x${FROM_SOURCE}" == "xtrue" ]; then
|
|||||||
git clone https://github.com/vllm-project/vllm
|
git clone https://github.com/vllm-project/vllm
|
||||||
fi
|
fi
|
||||||
pushd vllm
|
pushd vllm
|
||||||
uv pip install wheel packaging ninja "setuptools>=49.4.0" numpy typing-extensions pillow setuptools-scm grpcio==1.67.0 protobuf bitsandbytes
|
uv pip install wheel packaging ninja "setuptools>=49.4.0" numpy typing-extensions pillow setuptools-scm grpcio==1.68.1 protobuf bitsandbytes
|
||||||
uv pip install -v -r requirements-cpu.txt --extra-index-url https://download.pytorch.org/whl/cpu
|
uv pip install -v -r requirements-cpu.txt --extra-index-url https://download.pytorch.org/whl/cpu
|
||||||
VLLM_TARGET_DEVICE=cpu python setup.py install
|
VLLM_TARGET_DEVICE=cpu python setup.py install
|
||||||
popd
|
popd
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
grpcio==1.67.0
|
grpcio==1.68.1
|
||||||
protobuf
|
protobuf
|
||||||
certifi
|
certifi
|
||||||
setuptools
|
setuptools
|
||||||
@@ -1,38 +0,0 @@
|
|||||||
package core
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/mudler/LocalAI/core/config"
|
|
||||||
"github.com/mudler/LocalAI/core/services"
|
|
||||||
"github.com/mudler/LocalAI/pkg/model"
|
|
||||||
)
|
|
||||||
|
|
||||||
// The purpose of this structure is to hold pointers to all initialized services, to make plumbing easy
|
|
||||||
// Perhaps a proper DI system is worth it in the future, but for now keep things simple.
|
|
||||||
type Application struct {
|
|
||||||
|
|
||||||
// Application-Level Config
|
|
||||||
ApplicationConfig *config.ApplicationConfig
|
|
||||||
// ApplicationState *ApplicationState
|
|
||||||
|
|
||||||
// Core Low-Level Services
|
|
||||||
BackendConfigLoader *config.BackendConfigLoader
|
|
||||||
ModelLoader *model.ModelLoader
|
|
||||||
|
|
||||||
// Backend Services
|
|
||||||
// EmbeddingsBackendService *backend.EmbeddingsBackendService
|
|
||||||
// ImageGenerationBackendService *backend.ImageGenerationBackendService
|
|
||||||
// LLMBackendService *backend.LLMBackendService
|
|
||||||
// TranscriptionBackendService *backend.TranscriptionBackendService
|
|
||||||
// TextToSpeechBackendService *backend.TextToSpeechBackendService
|
|
||||||
|
|
||||||
// LocalAI System Services
|
|
||||||
BackendMonitorService *services.BackendMonitorService
|
|
||||||
GalleryService *services.GalleryService
|
|
||||||
LocalAIMetricsService *services.LocalAIMetricsService
|
|
||||||
// OpenAIService *services.OpenAIService
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO [NEXT PR?]: Break up ApplicationConfig.
|
|
||||||
// Migrate over stuff that is not set via config at all - especially runtime stuff
|
|
||||||
type ApplicationState struct {
|
|
||||||
}
|
|
||||||
39
core/application/application.go
Normal file
39
core/application/application.go
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
package application
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/mudler/LocalAI/core/config"
|
||||||
|
"github.com/mudler/LocalAI/pkg/model"
|
||||||
|
"github.com/mudler/LocalAI/pkg/templates"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Application struct {
|
||||||
|
backendLoader *config.BackendConfigLoader
|
||||||
|
modelLoader *model.ModelLoader
|
||||||
|
applicationConfig *config.ApplicationConfig
|
||||||
|
templatesEvaluator *templates.Evaluator
|
||||||
|
}
|
||||||
|
|
||||||
|
func newApplication(appConfig *config.ApplicationConfig) *Application {
|
||||||
|
return &Application{
|
||||||
|
backendLoader: config.NewBackendConfigLoader(appConfig.ModelPath),
|
||||||
|
modelLoader: model.NewModelLoader(appConfig.ModelPath),
|
||||||
|
applicationConfig: appConfig,
|
||||||
|
templatesEvaluator: templates.NewEvaluator(appConfig.ModelPath),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *Application) BackendLoader() *config.BackendConfigLoader {
|
||||||
|
return a.backendLoader
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *Application) ModelLoader() *model.ModelLoader {
|
||||||
|
return a.modelLoader
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *Application) ApplicationConfig() *config.ApplicationConfig {
|
||||||
|
return a.applicationConfig
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *Application) TemplatesEvaluator() *templates.Evaluator {
|
||||||
|
return a.templatesEvaluator
|
||||||
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package startup
|
package application
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
@@ -8,8 +8,8 @@ import (
|
|||||||
"path/filepath"
|
"path/filepath"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/fsnotify/fsnotify"
|
|
||||||
"dario.cat/mergo"
|
"dario.cat/mergo"
|
||||||
|
"github.com/fsnotify/fsnotify"
|
||||||
"github.com/mudler/LocalAI/core/config"
|
"github.com/mudler/LocalAI/core/config"
|
||||||
"github.com/rs/zerolog/log"
|
"github.com/rs/zerolog/log"
|
||||||
)
|
)
|
||||||
@@ -1,15 +1,15 @@
|
|||||||
package startup
|
package application
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
|
|
||||||
"github.com/mudler/LocalAI/core"
|
|
||||||
"github.com/mudler/LocalAI/core/backend"
|
"github.com/mudler/LocalAI/core/backend"
|
||||||
"github.com/mudler/LocalAI/core/config"
|
"github.com/mudler/LocalAI/core/config"
|
||||||
"github.com/mudler/LocalAI/core/services"
|
"github.com/mudler/LocalAI/core/services"
|
||||||
"github.com/mudler/LocalAI/internal"
|
"github.com/mudler/LocalAI/internal"
|
||||||
"github.com/mudler/LocalAI/pkg/assets"
|
"github.com/mudler/LocalAI/pkg/assets"
|
||||||
|
|
||||||
"github.com/mudler/LocalAI/pkg/library"
|
"github.com/mudler/LocalAI/pkg/library"
|
||||||
"github.com/mudler/LocalAI/pkg/model"
|
"github.com/mudler/LocalAI/pkg/model"
|
||||||
pkgStartup "github.com/mudler/LocalAI/pkg/startup"
|
pkgStartup "github.com/mudler/LocalAI/pkg/startup"
|
||||||
@@ -17,8 +17,9 @@ import (
|
|||||||
"github.com/rs/zerolog/log"
|
"github.com/rs/zerolog/log"
|
||||||
)
|
)
|
||||||
|
|
||||||
func Startup(opts ...config.AppOption) (*config.BackendConfigLoader, *model.ModelLoader, *config.ApplicationConfig, error) {
|
func New(opts ...config.AppOption) (*Application, error) {
|
||||||
options := config.NewApplicationConfig(opts...)
|
options := config.NewApplicationConfig(opts...)
|
||||||
|
application := newApplication(options)
|
||||||
|
|
||||||
log.Info().Msgf("Starting LocalAI using %d threads, with models path: %s", options.Threads, options.ModelPath)
|
log.Info().Msgf("Starting LocalAI using %d threads, with models path: %s", options.Threads, options.ModelPath)
|
||||||
log.Info().Msgf("LocalAI version: %s", internal.PrintableVersion())
|
log.Info().Msgf("LocalAI version: %s", internal.PrintableVersion())
|
||||||
@@ -36,28 +37,28 @@ func Startup(opts ...config.AppOption) (*config.BackendConfigLoader, *model.Mode
|
|||||||
|
|
||||||
// Make sure directories exists
|
// Make sure directories exists
|
||||||
if options.ModelPath == "" {
|
if options.ModelPath == "" {
|
||||||
return nil, nil, nil, fmt.Errorf("options.ModelPath cannot be empty")
|
return nil, fmt.Errorf("options.ModelPath cannot be empty")
|
||||||
}
|
}
|
||||||
err = os.MkdirAll(options.ModelPath, 0750)
|
err = os.MkdirAll(options.ModelPath, 0750)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, nil, fmt.Errorf("unable to create ModelPath: %q", err)
|
return nil, fmt.Errorf("unable to create ModelPath: %q", err)
|
||||||
}
|
}
|
||||||
if options.ImageDir != "" {
|
if options.ImageDir != "" {
|
||||||
err := os.MkdirAll(options.ImageDir, 0750)
|
err := os.MkdirAll(options.ImageDir, 0750)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, nil, fmt.Errorf("unable to create ImageDir: %q", err)
|
return nil, fmt.Errorf("unable to create ImageDir: %q", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if options.AudioDir != "" {
|
if options.AudioDir != "" {
|
||||||
err := os.MkdirAll(options.AudioDir, 0750)
|
err := os.MkdirAll(options.AudioDir, 0750)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, nil, fmt.Errorf("unable to create AudioDir: %q", err)
|
return nil, fmt.Errorf("unable to create AudioDir: %q", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if options.UploadDir != "" {
|
if options.UploadDir != "" {
|
||||||
err := os.MkdirAll(options.UploadDir, 0750)
|
err := os.MkdirAll(options.UploadDir, 0750)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, nil, fmt.Errorf("unable to create UploadDir: %q", err)
|
return nil, fmt.Errorf("unable to create UploadDir: %q", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -65,39 +66,36 @@ func Startup(opts ...config.AppOption) (*config.BackendConfigLoader, *model.Mode
|
|||||||
log.Error().Err(err).Msg("error installing models")
|
log.Error().Err(err).Msg("error installing models")
|
||||||
}
|
}
|
||||||
|
|
||||||
cl := config.NewBackendConfigLoader(options.ModelPath)
|
|
||||||
ml := model.NewModelLoader(options.ModelPath)
|
|
||||||
|
|
||||||
configLoaderOpts := options.ToConfigLoaderOptions()
|
configLoaderOpts := options.ToConfigLoaderOptions()
|
||||||
|
|
||||||
if err := cl.LoadBackendConfigsFromPath(options.ModelPath, configLoaderOpts...); err != nil {
|
if err := application.BackendLoader().LoadBackendConfigsFromPath(options.ModelPath, configLoaderOpts...); err != nil {
|
||||||
log.Error().Err(err).Msg("error loading config files")
|
log.Error().Err(err).Msg("error loading config files")
|
||||||
}
|
}
|
||||||
|
|
||||||
if options.ConfigFile != "" {
|
if options.ConfigFile != "" {
|
||||||
if err := cl.LoadMultipleBackendConfigsSingleFile(options.ConfigFile, configLoaderOpts...); err != nil {
|
if err := application.BackendLoader().LoadMultipleBackendConfigsSingleFile(options.ConfigFile, configLoaderOpts...); err != nil {
|
||||||
log.Error().Err(err).Msg("error loading config file")
|
log.Error().Err(err).Msg("error loading config file")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := cl.Preload(options.ModelPath); err != nil {
|
if err := application.BackendLoader().Preload(options.ModelPath); err != nil {
|
||||||
log.Error().Err(err).Msg("error downloading models")
|
log.Error().Err(err).Msg("error downloading models")
|
||||||
}
|
}
|
||||||
|
|
||||||
if options.PreloadJSONModels != "" {
|
if options.PreloadJSONModels != "" {
|
||||||
if err := services.ApplyGalleryFromString(options.ModelPath, options.PreloadJSONModels, options.EnforcePredownloadScans, options.Galleries); err != nil {
|
if err := services.ApplyGalleryFromString(options.ModelPath, options.PreloadJSONModels, options.EnforcePredownloadScans, options.Galleries); err != nil {
|
||||||
return nil, nil, nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if options.PreloadModelsFromPath != "" {
|
if options.PreloadModelsFromPath != "" {
|
||||||
if err := services.ApplyGalleryFromFile(options.ModelPath, options.PreloadModelsFromPath, options.EnforcePredownloadScans, options.Galleries); err != nil {
|
if err := services.ApplyGalleryFromFile(options.ModelPath, options.PreloadModelsFromPath, options.EnforcePredownloadScans, options.Galleries); err != nil {
|
||||||
return nil, nil, nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if options.Debug {
|
if options.Debug {
|
||||||
for _, v := range cl.GetAllBackendConfigs() {
|
for _, v := range application.BackendLoader().GetAllBackendConfigs() {
|
||||||
log.Debug().Msgf("Model: %s (config: %+v)", v.Name, v)
|
log.Debug().Msgf("Model: %s (config: %+v)", v.Name, v)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -123,7 +121,7 @@ func Startup(opts ...config.AppOption) (*config.BackendConfigLoader, *model.Mode
|
|||||||
go func() {
|
go func() {
|
||||||
<-options.Context.Done()
|
<-options.Context.Done()
|
||||||
log.Debug().Msgf("Context canceled, shutting down")
|
log.Debug().Msgf("Context canceled, shutting down")
|
||||||
err := ml.StopAllGRPC()
|
err := application.ModelLoader().StopAllGRPC()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error().Err(err).Msg("error while stopping all grpc backends")
|
log.Error().Err(err).Msg("error while stopping all grpc backends")
|
||||||
}
|
}
|
||||||
@@ -131,12 +129,12 @@ func Startup(opts ...config.AppOption) (*config.BackendConfigLoader, *model.Mode
|
|||||||
|
|
||||||
if options.WatchDog {
|
if options.WatchDog {
|
||||||
wd := model.NewWatchDog(
|
wd := model.NewWatchDog(
|
||||||
ml,
|
application.ModelLoader(),
|
||||||
options.WatchDogBusyTimeout,
|
options.WatchDogBusyTimeout,
|
||||||
options.WatchDogIdleTimeout,
|
options.WatchDogIdleTimeout,
|
||||||
options.WatchDogBusy,
|
options.WatchDogBusy,
|
||||||
options.WatchDogIdle)
|
options.WatchDogIdle)
|
||||||
ml.SetWatchDog(wd)
|
application.ModelLoader().SetWatchDog(wd)
|
||||||
go wd.Run()
|
go wd.Run()
|
||||||
go func() {
|
go func() {
|
||||||
<-options.Context.Done()
|
<-options.Context.Done()
|
||||||
@@ -147,7 +145,7 @@ func Startup(opts ...config.AppOption) (*config.BackendConfigLoader, *model.Mode
|
|||||||
|
|
||||||
if options.LoadToMemory != nil {
|
if options.LoadToMemory != nil {
|
||||||
for _, m := range options.LoadToMemory {
|
for _, m := range options.LoadToMemory {
|
||||||
cfg, err := cl.LoadBackendConfigFileByName(m, options.ModelPath,
|
cfg, err := application.BackendLoader().LoadBackendConfigFileByName(m, options.ModelPath,
|
||||||
config.LoadOptionDebug(options.Debug),
|
config.LoadOptionDebug(options.Debug),
|
||||||
config.LoadOptionThreads(options.Threads),
|
config.LoadOptionThreads(options.Threads),
|
||||||
config.LoadOptionContextSize(options.ContextSize),
|
config.LoadOptionContextSize(options.ContextSize),
|
||||||
@@ -155,22 +153,17 @@ func Startup(opts ...config.AppOption) (*config.BackendConfigLoader, *model.Mode
|
|||||||
config.ModelPath(options.ModelPath),
|
config.ModelPath(options.ModelPath),
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Debug().Msgf("Auto loading model %s into memory from file: %s", m, cfg.Model)
|
log.Debug().Msgf("Auto loading model %s into memory from file: %s", m, cfg.Model)
|
||||||
|
|
||||||
o := backend.ModelOptions(*cfg, options, []model.Option{})
|
o := backend.ModelOptions(*cfg, options)
|
||||||
|
|
||||||
var backendErr error
|
var backendErr error
|
||||||
if cfg.Backend != "" {
|
_, backendErr = application.ModelLoader().Load(o...)
|
||||||
o = append(o, model.WithBackendString(cfg.Backend))
|
|
||||||
_, backendErr = ml.BackendLoader(o...)
|
|
||||||
} else {
|
|
||||||
_, backendErr = ml.GreedyLoader(o...)
|
|
||||||
}
|
|
||||||
if backendErr != nil {
|
if backendErr != nil {
|
||||||
return nil, nil, nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -179,7 +172,7 @@ func Startup(opts ...config.AppOption) (*config.BackendConfigLoader, *model.Mode
|
|||||||
startWatcher(options)
|
startWatcher(options)
|
||||||
|
|
||||||
log.Info().Msg("core/startup process completed!")
|
log.Info().Msg("core/startup process completed!")
|
||||||
return cl, ml, options, nil
|
return application, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func startWatcher(options *config.ApplicationConfig) {
|
func startWatcher(options *config.ApplicationConfig) {
|
||||||
@@ -206,32 +199,3 @@ func startWatcher(options *config.ApplicationConfig) {
|
|||||||
log.Error().Err(err).Msg("failed creating watcher")
|
log.Error().Err(err).Msg("failed creating watcher")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// In Lieu of a proper DI framework, this function wires up the Application manually.
|
|
||||||
// This is in core/startup rather than core/state.go to keep package references clean!
|
|
||||||
func createApplication(appConfig *config.ApplicationConfig) *core.Application {
|
|
||||||
app := &core.Application{
|
|
||||||
ApplicationConfig: appConfig,
|
|
||||||
BackendConfigLoader: config.NewBackendConfigLoader(appConfig.ModelPath),
|
|
||||||
ModelLoader: model.NewModelLoader(appConfig.ModelPath),
|
|
||||||
}
|
|
||||||
|
|
||||||
var err error
|
|
||||||
|
|
||||||
// app.EmbeddingsBackendService = backend.NewEmbeddingsBackendService(app.ModelLoader, app.BackendConfigLoader, app.ApplicationConfig)
|
|
||||||
// app.ImageGenerationBackendService = backend.NewImageGenerationBackendService(app.ModelLoader, app.BackendConfigLoader, app.ApplicationConfig)
|
|
||||||
// app.LLMBackendService = backend.NewLLMBackendService(app.ModelLoader, app.BackendConfigLoader, app.ApplicationConfig)
|
|
||||||
// app.TranscriptionBackendService = backend.NewTranscriptionBackendService(app.ModelLoader, app.BackendConfigLoader, app.ApplicationConfig)
|
|
||||||
// app.TextToSpeechBackendService = backend.NewTextToSpeechBackendService(app.ModelLoader, app.BackendConfigLoader, app.ApplicationConfig)
|
|
||||||
|
|
||||||
app.BackendMonitorService = services.NewBackendMonitorService(app.ModelLoader, app.BackendConfigLoader, app.ApplicationConfig)
|
|
||||||
app.GalleryService = services.NewGalleryService(app.ApplicationConfig)
|
|
||||||
// app.OpenAIService = services.NewOpenAIService(app.ModelLoader, app.BackendConfigLoader, app.ApplicationConfig, app.LLMBackendService)
|
|
||||||
|
|
||||||
app.LocalAIMetricsService, err = services.NewLocalAIMetricsService()
|
|
||||||
if err != nil {
|
|
||||||
log.Error().Err(err).Msg("encountered an error initializing metrics service, startup will continue but metrics will not be tracked.")
|
|
||||||
}
|
|
||||||
|
|
||||||
return app
|
|
||||||
}
|
|
||||||
@@ -11,17 +11,9 @@ import (
|
|||||||
|
|
||||||
func ModelEmbedding(s string, tokens []int, loader *model.ModelLoader, backendConfig config.BackendConfig, appConfig *config.ApplicationConfig) (func() ([]float32, error), error) {
|
func ModelEmbedding(s string, tokens []int, loader *model.ModelLoader, backendConfig config.BackendConfig, appConfig *config.ApplicationConfig) (func() ([]float32, error), error) {
|
||||||
|
|
||||||
var inferenceModel interface{}
|
opts := ModelOptions(backendConfig, appConfig)
|
||||||
var err error
|
|
||||||
|
|
||||||
opts := ModelOptions(backendConfig, appConfig, []model.Option{})
|
inferenceModel, err := loader.Load(opts...)
|
||||||
|
|
||||||
if backendConfig.Backend == "" {
|
|
||||||
inferenceModel, err = loader.GreedyLoader(opts...)
|
|
||||||
} else {
|
|
||||||
opts = append(opts, model.WithBackendString(backendConfig.Backend))
|
|
||||||
inferenceModel, err = loader.BackendLoader(opts...)
|
|
||||||
}
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,9 +9,8 @@ import (
|
|||||||
|
|
||||||
func ImageGeneration(height, width, mode, step, seed int, positive_prompt, negative_prompt, src, dst string, loader *model.ModelLoader, backendConfig config.BackendConfig, appConfig *config.ApplicationConfig) (func() error, error) {
|
func ImageGeneration(height, width, mode, step, seed int, positive_prompt, negative_prompt, src, dst string, loader *model.ModelLoader, backendConfig config.BackendConfig, appConfig *config.ApplicationConfig) (func() error, error) {
|
||||||
|
|
||||||
opts := ModelOptions(backendConfig, appConfig, []model.Option{})
|
opts := ModelOptions(backendConfig, appConfig)
|
||||||
|
inferenceModel, err := loader.Load(
|
||||||
inferenceModel, err := loader.BackendLoader(
|
|
||||||
opts...,
|
opts...,
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -16,7 +16,6 @@ import (
|
|||||||
"github.com/mudler/LocalAI/core/schema"
|
"github.com/mudler/LocalAI/core/schema"
|
||||||
|
|
||||||
"github.com/mudler/LocalAI/core/gallery"
|
"github.com/mudler/LocalAI/core/gallery"
|
||||||
"github.com/mudler/LocalAI/pkg/grpc"
|
|
||||||
"github.com/mudler/LocalAI/pkg/grpc/proto"
|
"github.com/mudler/LocalAI/pkg/grpc/proto"
|
||||||
model "github.com/mudler/LocalAI/pkg/model"
|
model "github.com/mudler/LocalAI/pkg/model"
|
||||||
"github.com/mudler/LocalAI/pkg/utils"
|
"github.com/mudler/LocalAI/pkg/utils"
|
||||||
@@ -35,15 +34,6 @@ type TokenUsage struct {
|
|||||||
func ModelInference(ctx context.Context, s string, messages []schema.Message, images, videos, audios []string, loader *model.ModelLoader, c config.BackendConfig, o *config.ApplicationConfig, tokenCallback func(string, TokenUsage) bool) (func() (LLMResponse, error), error) {
|
func ModelInference(ctx context.Context, s string, messages []schema.Message, images, videos, audios []string, loader *model.ModelLoader, c config.BackendConfig, o *config.ApplicationConfig, tokenCallback func(string, TokenUsage) bool) (func() (LLMResponse, error), error) {
|
||||||
modelFile := c.Model
|
modelFile := c.Model
|
||||||
|
|
||||||
var inferenceModel grpc.Backend
|
|
||||||
var err error
|
|
||||||
|
|
||||||
opts := ModelOptions(c, o, []model.Option{})
|
|
||||||
|
|
||||||
if c.Backend != "" {
|
|
||||||
opts = append(opts, model.WithBackendString(c.Backend))
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check if the modelFile exists, if it doesn't try to load it from the gallery
|
// Check if the modelFile exists, if it doesn't try to load it from the gallery
|
||||||
if o.AutoloadGalleries { // experimental
|
if o.AutoloadGalleries { // experimental
|
||||||
if _, err := os.Stat(modelFile); os.IsNotExist(err) {
|
if _, err := os.Stat(modelFile); os.IsNotExist(err) {
|
||||||
@@ -56,12 +46,8 @@ func ModelInference(ctx context.Context, s string, messages []schema.Message, im
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if c.Backend == "" {
|
opts := ModelOptions(c, o)
|
||||||
inferenceModel, err = loader.GreedyLoader(opts...)
|
inferenceModel, err := loader.Load(opts...)
|
||||||
} else {
|
|
||||||
inferenceModel, err = loader.BackendLoader(opts...)
|
|
||||||
}
|
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ import (
|
|||||||
"github.com/rs/zerolog/log"
|
"github.com/rs/zerolog/log"
|
||||||
)
|
)
|
||||||
|
|
||||||
func ModelOptions(c config.BackendConfig, so *config.ApplicationConfig, opts []model.Option) []model.Option {
|
func ModelOptions(c config.BackendConfig, so *config.ApplicationConfig, opts ...model.Option) []model.Option {
|
||||||
name := c.Name
|
name := c.Name
|
||||||
if name == "" {
|
if name == "" {
|
||||||
name = c.Model
|
name = c.Model
|
||||||
@@ -122,14 +122,17 @@ func grpcModelOpts(c config.BackendConfig) *pb.ModelOptions {
|
|||||||
CUDA: c.CUDA || c.Diffusers.CUDA,
|
CUDA: c.CUDA || c.Diffusers.CUDA,
|
||||||
SchedulerType: c.Diffusers.SchedulerType,
|
SchedulerType: c.Diffusers.SchedulerType,
|
||||||
PipelineType: c.Diffusers.PipelineType,
|
PipelineType: c.Diffusers.PipelineType,
|
||||||
CFGScale: c.Diffusers.CFGScale,
|
CFGScale: c.CFGScale,
|
||||||
LoraAdapter: c.LoraAdapter,
|
LoraAdapter: c.LoraAdapter,
|
||||||
LoraScale: c.LoraScale,
|
LoraScale: c.LoraScale,
|
||||||
|
LoraAdapters: c.LoraAdapters,
|
||||||
|
LoraScales: c.LoraScales,
|
||||||
F16Memory: f16,
|
F16Memory: f16,
|
||||||
LoraBase: c.LoraBase,
|
LoraBase: c.LoraBase,
|
||||||
IMG2IMG: c.Diffusers.IMG2IMG,
|
IMG2IMG: c.Diffusers.IMG2IMG,
|
||||||
CLIPModel: c.Diffusers.ClipModel,
|
CLIPModel: c.Diffusers.ClipModel,
|
||||||
CLIPSubfolder: c.Diffusers.ClipSubFolder,
|
CLIPSubfolder: c.Diffusers.ClipSubFolder,
|
||||||
|
Options: c.Options,
|
||||||
CLIPSkip: int32(c.Diffusers.ClipSkip),
|
CLIPSkip: int32(c.Diffusers.ClipSkip),
|
||||||
ControlNet: c.Diffusers.ControlNet,
|
ControlNet: c.Diffusers.ControlNet,
|
||||||
ContextSize: int32(ctxSize),
|
ContextSize: int32(ctxSize),
|
||||||
@@ -139,6 +142,7 @@ func grpcModelOpts(c config.BackendConfig) *pb.ModelOptions {
|
|||||||
DraftModel: c.DraftModel,
|
DraftModel: c.DraftModel,
|
||||||
AudioPath: c.VallE.AudioPath,
|
AudioPath: c.VallE.AudioPath,
|
||||||
Quantization: c.Quantization,
|
Quantization: c.Quantization,
|
||||||
|
LoadFormat: c.LoadFormat,
|
||||||
GPUMemoryUtilization: c.GPUMemoryUtilization,
|
GPUMemoryUtilization: c.GPUMemoryUtilization,
|
||||||
TrustRemoteCode: c.TrustRemoteCode,
|
TrustRemoteCode: c.TrustRemoteCode,
|
||||||
EnforceEager: c.EnforceEager,
|
EnforceEager: c.EnforceEager,
|
||||||
@@ -147,6 +151,8 @@ func grpcModelOpts(c config.BackendConfig) *pb.ModelOptions {
|
|||||||
TensorParallelSize: int32(c.TensorParallelSize),
|
TensorParallelSize: int32(c.TensorParallelSize),
|
||||||
MMProj: c.MMProj,
|
MMProj: c.MMProj,
|
||||||
FlashAttention: c.FlashAttention,
|
FlashAttention: c.FlashAttention,
|
||||||
|
CacheTypeKey: c.CacheTypeK,
|
||||||
|
CacheTypeValue: c.CacheTypeV,
|
||||||
NoKVOffload: c.NoKVOffloading,
|
NoKVOffload: c.NoKVOffloading,
|
||||||
YarnExtFactor: c.YarnExtFactor,
|
YarnExtFactor: c.YarnExtFactor,
|
||||||
YarnAttnFactor: c.YarnAttnFactor,
|
YarnAttnFactor: c.YarnAttnFactor,
|
||||||
|
|||||||
@@ -11,8 +11,8 @@ import (
|
|||||||
|
|
||||||
func Rerank(modelFile string, request *proto.RerankRequest, loader *model.ModelLoader, appConfig *config.ApplicationConfig, backendConfig config.BackendConfig) (*proto.RerankResult, error) {
|
func Rerank(modelFile string, request *proto.RerankRequest, loader *model.ModelLoader, appConfig *config.ApplicationConfig, backendConfig config.BackendConfig) (*proto.RerankResult, error) {
|
||||||
|
|
||||||
opts := ModelOptions(backendConfig, appConfig, []model.Option{model.WithModel(modelFile)})
|
opts := ModelOptions(backendConfig, appConfig, model.WithModel(modelFile))
|
||||||
rerankModel, err := loader.BackendLoader(opts...)
|
rerankModel, err := loader.Load(opts...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,9 +25,8 @@ func SoundGeneration(
|
|||||||
backendConfig config.BackendConfig,
|
backendConfig config.BackendConfig,
|
||||||
) (string, *proto.Result, error) {
|
) (string, *proto.Result, error) {
|
||||||
|
|
||||||
opts := ModelOptions(backendConfig, appConfig, []model.Option{model.WithModel(modelFile)})
|
opts := ModelOptions(backendConfig, appConfig, model.WithModel(modelFile))
|
||||||
|
soundGenModel, err := loader.Load(opts...)
|
||||||
soundGenModel, err := loader.BackendLoader(opts...)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", nil, err
|
return "", nil, err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,16 +8,15 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func StoreBackend(sl *model.ModelLoader, appConfig *config.ApplicationConfig, storeName string) (grpc.Backend, error) {
|
func StoreBackend(sl *model.ModelLoader, appConfig *config.ApplicationConfig, storeName string) (grpc.Backend, error) {
|
||||||
if storeName == "" {
|
if storeName == "" {
|
||||||
storeName = "default"
|
storeName = "default"
|
||||||
}
|
}
|
||||||
|
|
||||||
sc := []model.Option{
|
sc := []model.Option{
|
||||||
model.WithBackendString(model.LocalStoreBackend),
|
model.WithBackendString(model.LocalStoreBackend),
|
||||||
model.WithAssetDir(appConfig.AssetsDestination),
|
model.WithAssetDir(appConfig.AssetsDestination),
|
||||||
model.WithModel(storeName),
|
model.WithModel(storeName),
|
||||||
}
|
}
|
||||||
|
|
||||||
return sl.BackendLoader(sc...)
|
return sl.Load(sc...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -15,10 +15,8 @@ func TokenMetrics(
|
|||||||
appConfig *config.ApplicationConfig,
|
appConfig *config.ApplicationConfig,
|
||||||
backendConfig config.BackendConfig) (*proto.MetricsResponse, error) {
|
backendConfig config.BackendConfig) (*proto.MetricsResponse, error) {
|
||||||
|
|
||||||
opts := ModelOptions(backendConfig, appConfig, []model.Option{
|
opts := ModelOptions(backendConfig, appConfig, model.WithModel(modelFile))
|
||||||
model.WithModel(modelFile),
|
model, err := loader.Load(opts...)
|
||||||
})
|
|
||||||
model, err := loader.BackendLoader(opts...)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,15 +14,13 @@ func ModelTokenize(s string, loader *model.ModelLoader, backendConfig config.Bac
|
|||||||
var inferenceModel grpc.Backend
|
var inferenceModel grpc.Backend
|
||||||
var err error
|
var err error
|
||||||
|
|
||||||
opts := ModelOptions(backendConfig, appConfig, []model.Option{
|
opts := ModelOptions(backendConfig, appConfig, model.WithModel(modelFile))
|
||||||
model.WithModel(modelFile),
|
|
||||||
})
|
|
||||||
|
|
||||||
if backendConfig.Backend == "" {
|
if backendConfig.Backend == "" {
|
||||||
inferenceModel, err = loader.GreedyLoader(opts...)
|
inferenceModel, err = loader.Load(opts...)
|
||||||
} else {
|
} else {
|
||||||
opts = append(opts, model.WithBackendString(backendConfig.Backend))
|
opts = append(opts, model.WithBackendString(backendConfig.Backend))
|
||||||
inferenceModel, err = loader.BackendLoader(opts...)
|
inferenceModel, err = loader.Load(opts...)
|
||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return schema.TokenizeResponse{}, err
|
return schema.TokenizeResponse{}, err
|
||||||
|
|||||||
@@ -18,9 +18,9 @@ func ModelTranscription(audio, language string, translate bool, ml *model.ModelL
|
|||||||
backendConfig.Backend = model.WhisperBackend
|
backendConfig.Backend = model.WhisperBackend
|
||||||
}
|
}
|
||||||
|
|
||||||
opts := ModelOptions(backendConfig, appConfig, []model.Option{})
|
opts := ModelOptions(backendConfig, appConfig)
|
||||||
|
|
||||||
transcriptionModel, err := ml.BackendLoader(opts...)
|
transcriptionModel, err := ml.Load(opts...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,11 +28,8 @@ func ModelTTS(
|
|||||||
bb = model.PiperBackend
|
bb = model.PiperBackend
|
||||||
}
|
}
|
||||||
|
|
||||||
opts := ModelOptions(config.BackendConfig{}, appConfig, []model.Option{
|
opts := ModelOptions(backendConfig, appConfig, model.WithBackendString(bb), model.WithModel(modelFile))
|
||||||
model.WithBackendString(bb),
|
ttsModel, err := loader.Load(opts...)
|
||||||
model.WithModel(modelFile),
|
|
||||||
})
|
|
||||||
ttsModel, err := loader.BackendLoader(opts...)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", nil, err
|
return "", nil, err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,12 +6,12 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/mudler/LocalAI/core/application"
|
||||||
cli_api "github.com/mudler/LocalAI/core/cli/api"
|
cli_api "github.com/mudler/LocalAI/core/cli/api"
|
||||||
cliContext "github.com/mudler/LocalAI/core/cli/context"
|
cliContext "github.com/mudler/LocalAI/core/cli/context"
|
||||||
"github.com/mudler/LocalAI/core/config"
|
"github.com/mudler/LocalAI/core/config"
|
||||||
"github.com/mudler/LocalAI/core/http"
|
"github.com/mudler/LocalAI/core/http"
|
||||||
"github.com/mudler/LocalAI/core/p2p"
|
"github.com/mudler/LocalAI/core/p2p"
|
||||||
"github.com/mudler/LocalAI/core/startup"
|
|
||||||
"github.com/rs/zerolog"
|
"github.com/rs/zerolog"
|
||||||
"github.com/rs/zerolog/log"
|
"github.com/rs/zerolog/log"
|
||||||
)
|
)
|
||||||
@@ -53,6 +53,7 @@ type RunCMD struct {
|
|||||||
OpaqueErrors bool `env:"LOCALAI_OPAQUE_ERRORS" default:"false" help:"If true, all error responses are replaced with blank 500 errors. This is intended only for hardening against information leaks and is normally not recommended." group:"hardening"`
|
OpaqueErrors bool `env:"LOCALAI_OPAQUE_ERRORS" default:"false" help:"If true, all error responses are replaced with blank 500 errors. This is intended only for hardening against information leaks and is normally not recommended." group:"hardening"`
|
||||||
UseSubtleKeyComparison bool `env:"LOCALAI_SUBTLE_KEY_COMPARISON" default:"false" help:"If true, API Key validation comparisons will be performed using constant-time comparisons rather than simple equality. This trades off performance on each request for resiliancy against timing attacks." group:"hardening"`
|
UseSubtleKeyComparison bool `env:"LOCALAI_SUBTLE_KEY_COMPARISON" default:"false" help:"If true, API Key validation comparisons will be performed using constant-time comparisons rather than simple equality. This trades off performance on each request for resiliancy against timing attacks." group:"hardening"`
|
||||||
DisableApiKeyRequirementForHttpGet bool `env:"LOCALAI_DISABLE_API_KEY_REQUIREMENT_FOR_HTTP_GET" default:"false" help:"If true, a valid API key is not required to issue GET requests to portions of the web ui. This should only be enabled in secure testing environments" group:"hardening"`
|
DisableApiKeyRequirementForHttpGet bool `env:"LOCALAI_DISABLE_API_KEY_REQUIREMENT_FOR_HTTP_GET" default:"false" help:"If true, a valid API key is not required to issue GET requests to portions of the web ui. This should only be enabled in secure testing environments" group:"hardening"`
|
||||||
|
DisableMetricsEndpoint bool `env:"LOCALAI_DISABLE_METRICS_ENDPOINT,DISABLE_METRICS_ENDPOINT" default:"false" help:"Disable the /metrics endpoint" group:"api"`
|
||||||
HttpGetExemptedEndpoints []string `env:"LOCALAI_HTTP_GET_EXEMPTED_ENDPOINTS" default:"^/$,^/browse/?$,^/talk/?$,^/p2p/?$,^/chat/?$,^/text2image/?$,^/tts/?$,^/static/.*$,^/swagger.*$" help:"If LOCALAI_DISABLE_API_KEY_REQUIREMENT_FOR_HTTP_GET is overriden to true, this is the list of endpoints to exempt. Only adjust this in case of a security incident or as a result of a personal security posture review" group:"hardening"`
|
HttpGetExemptedEndpoints []string `env:"LOCALAI_HTTP_GET_EXEMPTED_ENDPOINTS" default:"^/$,^/browse/?$,^/talk/?$,^/p2p/?$,^/chat/?$,^/text2image/?$,^/tts/?$,^/static/.*$,^/swagger.*$" help:"If LOCALAI_DISABLE_API_KEY_REQUIREMENT_FOR_HTTP_GET is overriden to true, this is the list of endpoints to exempt. Only adjust this in case of a security incident or as a result of a personal security posture review" group:"hardening"`
|
||||||
Peer2Peer bool `env:"LOCALAI_P2P,P2P" name:"p2p" default:"false" help:"Enable P2P mode" group:"p2p"`
|
Peer2Peer bool `env:"LOCALAI_P2P,P2P" name:"p2p" default:"false" help:"Enable P2P mode" group:"p2p"`
|
||||||
Peer2PeerDHTInterval int `env:"LOCALAI_P2P_DHT_INTERVAL,P2P_DHT_INTERVAL" default:"360" name:"p2p-dht-interval" help:"Interval for DHT refresh (used during token generation)" group:"p2p"`
|
Peer2PeerDHTInterval int `env:"LOCALAI_P2P_DHT_INTERVAL,P2P_DHT_INTERVAL" default:"360" name:"p2p-dht-interval" help:"Interval for DHT refresh (used during token generation)" group:"p2p"`
|
||||||
@@ -108,6 +109,10 @@ func (r *RunCMD) Run(ctx *cliContext.Context) error {
|
|||||||
config.WithLoadToMemory(r.LoadToMemory),
|
config.WithLoadToMemory(r.LoadToMemory),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if r.DisableMetricsEndpoint {
|
||||||
|
opts = append(opts, config.DisableMetricsEndpoint)
|
||||||
|
}
|
||||||
|
|
||||||
token := ""
|
token := ""
|
||||||
if r.Peer2Peer || r.Peer2PeerToken != "" {
|
if r.Peer2Peer || r.Peer2PeerToken != "" {
|
||||||
log.Info().Msg("P2P mode enabled")
|
log.Info().Msg("P2P mode enabled")
|
||||||
@@ -181,16 +186,16 @@ func (r *RunCMD) Run(ctx *cliContext.Context) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if r.PreloadBackendOnly {
|
if r.PreloadBackendOnly {
|
||||||
_, _, _, err := startup.Startup(opts...)
|
_, err := application.New(opts...)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
cl, ml, options, err := startup.Startup(opts...)
|
app, err := application.New(opts...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("failed basic startup tasks with error %s", err.Error())
|
return fmt.Errorf("failed basic startup tasks with error %s", err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
appHTTP, err := http.App(cl, ml, options)
|
appHTTP, err := http.API(app)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error().Err(err).Msg("error during HTTP App construction")
|
log.Error().Err(err).Msg("error during HTTP App construction")
|
||||||
return err
|
return err
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user