-
-
Notifications
You must be signed in to change notification settings - Fork 2.1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat(conda):Add seperate env for huggingface (#1146)
**Description** This PR is related to #1117 **Notes for Reviewers** * Add conda env `huggingface.yml` * Change the import order, and also remove the no-used packages * Add `run.sh` and `make command` to the main Dockerfile and Makefile * Add test cases for it. It can be triggered and succeed under VSCode Python extension but it is hang by using `python -m unites test_huggingface.py` in the terminal ``` Running tests (unittest): /workspaces/LocalAI/extra/grpc/huggingface Running tests: /workspaces/LocalAI/extra/grpc/huggingface/test_huggingface.py::TestBackendServicer::test_embedding /workspaces/LocalAI/extra/grpc/huggingface/test_huggingface.py::TestBackendServicer::test_load_model /workspaces/LocalAI/extra/grpc/huggingface/test_huggingface.py::TestBackendServicer::test_server_startup ./test_huggingface.py::TestBackendServicer::test_embedding Passed ./test_huggingface.py::TestBackendServicer::test_load_model Passed ./test_huggingface.py::TestBackendServicer::test_server_startup Passed Total number of tests expected to run: 3 Total number of tests run: 3 Total number of tests passed: 3 Total number of tests failed: 0 Total number of tests failed with errors: 0 Total number of tests skipped: 0 Finished running tests! ``` **[Signed commits](../CONTRIBUTING.md#signing-off-on-commits-developer-certificate-of-origin)** - [x] Yes, I signed my commits. <!-- Thank you for contributing to LocalAI! Contributing Conventions ------------------------- The draft above helps to give a quick overview of your PR. Remember to remove this comment and to at least: 1. Include descriptive PR titles with [<component-name>] prepended. We use [conventional commits](https://www.conventionalcommits.org/en/v1.0.0/). 2. Build and test your changes before submitting a PR (`make build`). 3. Sign your commits 4. **Tag maintainer:** for a quicker response, tag the relevant maintainer (see below). 5. **X/Twitter handle:** we announce bigger features on X/Twitter. If your PR gets announced, and you'd like a mention, we'll gladly shout you out! By following the community's contribution conventions upfront, the review process will be accelerated and your PR merged more quickly. If no one reviews your PR within a few days, please @-mention @mudler. --> Signed-off-by: GitHub <[email protected]>
- Loading branch information
Showing
9 changed files
with
253 additions
and
6 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
.PONY: huggingface | ||
huggingface: | ||
@echo "Creating virtual environment..." | ||
@conda env create --name huggingface --file huggingface.yml | ||
@echo "Virtual environment created." | ||
|
||
.PONY: run | ||
run: | ||
@echo "Running huggingface..." | ||
bash run.sh | ||
@echo "huggingface run." | ||
|
||
# It is not working well by using command line. It only6 works with IDE like VSCode. | ||
.PONY: test | ||
test: | ||
@echo "Testing huggingface..." | ||
bash test.sh | ||
@echo "huggingface tested." |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
# Creating a separate environment for the huggingface project | ||
|
||
``` | ||
make huggingface | ||
``` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,77 @@ | ||
name: huggingface | ||
channels: | ||
- defaults | ||
dependencies: | ||
- _libgcc_mutex=0.1=main | ||
- _openmp_mutex=5.1=1_gnu | ||
- bzip2=1.0.8=h7b6447c_0 | ||
- ca-certificates=2023.08.22=h06a4308_0 | ||
- ld_impl_linux-64=2.38=h1181459_1 | ||
- libffi=3.4.4=h6a678d5_0 | ||
- libgcc-ng=11.2.0=h1234567_1 | ||
- libgomp=11.2.0=h1234567_1 | ||
- libstdcxx-ng=11.2.0=h1234567_1 | ||
- libuuid=1.41.5=h5eee18b_0 | ||
- ncurses=6.4=h6a678d5_0 | ||
- openssl=3.0.11=h7f8727e_2 | ||
- pip=23.2.1=py311h06a4308_0 | ||
- python=3.11.5=h955ad1f_0 | ||
- readline=8.2=h5eee18b_0 | ||
- setuptools=68.0.0=py311h06a4308_0 | ||
- sqlite=3.41.2=h5eee18b_0 | ||
- tk=8.6.12=h1ccaba5_0 | ||
- tzdata=2023c=h04d1e81_0 | ||
- wheel=0.41.2=py311h06a4308_0 | ||
- xz=5.4.2=h5eee18b_0 | ||
- zlib=1.2.13=h5eee18b_0 | ||
- pip: | ||
- certifi==2023.7.22 | ||
- charset-normalizer==3.3.0 | ||
- click==8.1.7 | ||
- filelock==3.12.4 | ||
- fsspec==2023.9.2 | ||
- grpcio==1.59.0 | ||
- huggingface-hub==0.17.3 | ||
- idna==3.4 | ||
- install==1.3.5 | ||
- jinja2==3.1.2 | ||
- joblib==1.3.2 | ||
- markupsafe==2.1.3 | ||
- mpmath==1.3.0 | ||
- networkx==3.1 | ||
- nltk==3.8.1 | ||
- numpy==1.26.0 | ||
- nvidia-cublas-cu12==12.1.3.1 | ||
- nvidia-cuda-cupti-cu12==12.1.105 | ||
- nvidia-cuda-nvrtc-cu12==12.1.105 | ||
- nvidia-cuda-runtime-cu12==12.1.105 | ||
- nvidia-cudnn-cu12==8.9.2.26 | ||
- nvidia-cufft-cu12==11.0.2.54 | ||
- nvidia-curand-cu12==10.3.2.106 | ||
- nvidia-cusolver-cu12==11.4.5.107 | ||
- nvidia-cusparse-cu12==12.1.0.106 | ||
- nvidia-nccl-cu12==2.18.1 | ||
- nvidia-nvjitlink-cu12==12.2.140 | ||
- nvidia-nvtx-cu12==12.1.105 | ||
- packaging==23.2 | ||
- pillow==10.0.1 | ||
- protobuf==4.24.4 | ||
- pyyaml==6.0.1 | ||
- regex==2023.10.3 | ||
- requests==2.31.0 | ||
- safetensors==0.4.0 | ||
- scikit-learn==1.3.1 | ||
- scipy==1.11.3 | ||
- sentence-transformers==2.2.2 | ||
- sentencepiece==0.1.99 | ||
- sympy==1.12 | ||
- threadpoolctl==3.2.0 | ||
- tokenizers==0.14.1 | ||
- torch==2.1.0 | ||
- torchvision==0.16.0 | ||
- tqdm==4.66.1 | ||
- transformers==4.34.0 | ||
- triton==2.1.0 | ||
- typing-extensions==4.8.0 | ||
- urllib3==2.0.6 | ||
prefix: /opt/conda/envs/huggingface |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
## | ||
## A bash script wrapper that runs the huggingface server with conda | ||
|
||
# Activate conda environment | ||
source activate huggingface | ||
|
||
# get the directory where the bash script is located | ||
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" | ||
|
||
python $DIR/huggingface.py |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
## | ||
## A bash script wrapper that runs the huggingface server with conda | ||
|
||
# Activate conda environment | ||
source activate huggingface | ||
|
||
# get the directory where the bash script is located | ||
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" | ||
|
||
python -m unittest $DIR/test_huggingface.py |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,81 @@ | ||
""" | ||
A test script to test the gRPC service | ||
""" | ||
import unittest | ||
import subprocess | ||
import time | ||
import backend_pb2 | ||
import backend_pb2_grpc | ||
|
||
import grpc | ||
|
||
|
||
class TestBackendServicer(unittest.TestCase): | ||
""" | ||
TestBackendServicer is the class that tests the gRPC service | ||
""" | ||
def setUp(self): | ||
""" | ||
This method sets up the gRPC service by starting the server | ||
""" | ||
self.service = subprocess.Popen(["python3", "huggingface.py", "--addr", "localhost:50051"]) | ||
|
||
def tearDown(self) -> None: | ||
""" | ||
This method tears down the gRPC service by terminating the server | ||
""" | ||
self.service.terminate() | ||
self.service.wait() | ||
|
||
def test_server_startup(self): | ||
""" | ||
This method tests if the server starts up successfully | ||
""" | ||
time.sleep(2) | ||
try: | ||
self.setUp() | ||
with grpc.insecure_channel("localhost:50051") as channel: | ||
stub = backend_pb2_grpc.BackendStub(channel) | ||
response = stub.Health(backend_pb2.HealthMessage()) | ||
self.assertEqual(response.message, b'OK') | ||
except Exception as err: | ||
print(err) | ||
self.fail("Server failed to start") | ||
finally: | ||
self.tearDown() | ||
|
||
def test_load_model(self): | ||
""" | ||
This method tests if the model is loaded successfully | ||
""" | ||
try: | ||
self.setUp() | ||
with grpc.insecure_channel("localhost:50051") as channel: | ||
stub = backend_pb2_grpc.BackendStub(channel) | ||
response = stub.LoadModel(backend_pb2.ModelOptions(Model="bert-base-nli-mean-tokens")) | ||
self.assertTrue(response.success) | ||
self.assertEqual(response.message, "Model loaded successfully") | ||
except Exception as err: | ||
print(err) | ||
self.fail("LoadModel service failed") | ||
finally: | ||
self.tearDown() | ||
|
||
def test_embedding(self): | ||
""" | ||
This method tests if the embeddings are generated successfully | ||
""" | ||
try: | ||
self.setUp() | ||
with grpc.insecure_channel("localhost:50051") as channel: | ||
stub = backend_pb2_grpc.BackendStub(channel) | ||
response = stub.LoadModel(backend_pb2.ModelOptions(Model="bert-base-nli-mean-tokens")) | ||
self.assertTrue(response.success) | ||
embedding_request = backend_pb2.PredictOptions(Embeddings="This is a test sentence.") | ||
embedding_response = stub.Embedding(embedding_request) | ||
self.assertIsNotNone(embedding_response.embeddings) | ||
except Exception as err: | ||
print(err) | ||
self.fail("Embedding service failed") | ||
finally: | ||
self.tearDown() |