diff --git a/.github/workflows/test-extra.yml b/.github/workflows/test-extra.yml index 36621386..30c198af 100644 --- a/.github/workflows/test-extra.yml +++ b/.github/workflows/test-extra.yml @@ -14,41 +14,9 @@ concurrency: cancel-in-progress: true jobs: - tests-linux: + tests-transformers: runs-on: ubuntu-latest steps: - - name: Release space from worker - run: | - echo "Listing top largest packages" - pkgs=$(dpkg-query -Wf '${Installed-Size}\t${Package}\t${Status}\n' | awk '$NF == "installed"{print $1 "\t" $2}' | sort -nr) - head -n 30 <<< "${pkgs}" - echo - df -h - echo - sudo apt-get remove -y '^llvm-.*|^libllvm.*' || true - sudo apt-get remove --auto-remove android-sdk-platform-tools || true - sudo apt-get purge --auto-remove android-sdk-platform-tools || true - sudo rm -rf /usr/local/lib/android - sudo apt-get remove -y '^dotnet-.*|^aspnetcore-.*' || true - sudo rm -rf /usr/share/dotnet - sudo apt-get remove -y '^mono-.*' || true - sudo apt-get remove -y '^ghc-.*' || true - sudo apt-get remove -y '.*jdk.*|.*jre.*' || true - sudo apt-get remove -y 'php.*' || true - sudo apt-get remove -y hhvm powershell firefox monodoc-manual msbuild || true - sudo apt-get remove -y '^google-.*' || true - sudo apt-get remove -y azure-cli || true - sudo apt-get remove -y '^mongo.*-.*|^postgresql-.*|^mysql-.*|^mssql-.*' || true - sudo apt-get remove -y '^gfortran-.*' || true - sudo apt-get autoremove -y - sudo apt-get clean - echo - echo "Listing top largest packages" - pkgs=$(dpkg-query -Wf '${Installed-Size}\t${Package}\t${Status}\n' | awk '$NF == "installed"{print $1 "\t" $2}' | sort -nr) - head -n 30 <<< "${pkgs}" - echo - sudo rm -rfv build || true - df -h - name: Clone uses: actions/checkout@v4 with: @@ -69,7 +37,41 @@ jobs: sudo rm -rfv /usr/bin/conda || true - - name: Test + - name: Test transformers run: | - PATH=$PATH:/opt/conda/bin make test-extra + export PATH=$PATH:/opt/conda/bin + make -C backend/python/transformers + make -C backend/python/transformers test + + + tests-diffusers: + runs-on: ubuntu-latest + steps: + - name: Clone + uses: actions/checkout@v4 + with: + submodules: true + - name: Dependencies + run: | + sudo apt-get update + sudo apt-get install build-essential ffmpeg + curl https://repo.anaconda.com/pkgs/misc/gpgkeys/anaconda.asc | gpg --dearmor > conda.gpg && \ + sudo install -o root -g root -m 644 conda.gpg /usr/share/keyrings/conda-archive-keyring.gpg && \ + gpg --keyring /usr/share/keyrings/conda-archive-keyring.gpg --no-default-keyring --fingerprint 34161F5BF5EB1D4BFBBB8F0A8AEB4F8B29D82806 && \ + sudo /bin/bash -c 'echo "deb [arch=amd64 signed-by=/usr/share/keyrings/conda-archive-keyring.gpg] https://repo.anaconda.com/pkgs/misc/debrepo/conda stable main" > /etc/apt/sources.list.d/conda.list' && \ + sudo /bin/bash -c 'echo "deb [arch=amd64 signed-by=/usr/share/keyrings/conda-archive-keyring.gpg] https://repo.anaconda.com/pkgs/misc/debrepo/conda stable main" | tee -a /etc/apt/sources.list.d/conda.list' && \ + sudo apt-get update && \ + sudo apt-get install -y conda + sudo apt-get install -y ca-certificates cmake curl patch + sudo apt-get install -y libopencv-dev && sudo ln -s /usr/include/opencv4/opencv2 /usr/include/opencv2 + + sudo rm -rfv /usr/bin/conda || true + + - name: Test diffusers + run: | + export PATH=$PATH:/opt/conda/bin + make -C backend/python/diffusers + make -C backend/python/diffusers test + + \ No newline at end of file diff --git a/Makefile b/Makefile index cbc8f2f1..f2280e0b 100644 --- a/Makefile +++ b/Makefile @@ -416,9 +416,11 @@ prepare-extra-conda-environments: prepare-test-extra: $(MAKE) -C backend/python/transformers + $(MAKE) -C backend/python/diffusers test-extra: prepare-test-extra $(MAKE) -C backend/python/transformers test + $(MAKE) -C backend/python/diffusers test backend-assets/grpc: mkdir -p backend-assets/grpc diff --git a/backend/python/diffusers/Makefile b/backend/python/diffusers/Makefile index fa0087e2..f3f9d4e2 100644 --- a/backend/python/diffusers/Makefile +++ b/backend/python/diffusers/Makefile @@ -9,3 +9,6 @@ run: @echo "Running diffusers..." bash run.sh @echo "Diffusers run." + +test: + bash test.sh \ No newline at end of file diff --git a/backend/python/diffusers/backend_diffusers.py b/backend/python/diffusers/backend_diffusers.py index 9d331f64..777db94a 100755 --- a/backend/python/diffusers/backend_diffusers.py +++ b/backend/python/diffusers/backend_diffusers.py @@ -303,12 +303,17 @@ class BackendServicer(backend_pb2_grpc.BackendServicer): prompt = request.positive_prompt + steps = 1 + + if request.step != 0: + steps = request.step + # create a dictionary of values for the parameters options = { "negative_prompt": request.negative_prompt, "width": request.width, "height": request.height, - "num_inference_steps": request.step, + "num_inference_steps": steps, } if request.src != "": diff --git a/backend/python/diffusers/test.py b/backend/python/diffusers/test.py new file mode 100644 index 00000000..c03663e1 --- /dev/null +++ b/backend/python/diffusers/test.py @@ -0,0 +1,84 @@ +""" +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", "backend_diffusers.py", "--addr", "localhost:50051"]) + + def tearDown(self) -> None: + """ + This method tears down the gRPC service by terminating the server + """ + self.service.kill() + self.service.wait() + + def test_server_startup(self): + """ + This method tests if the server starts up successfully + """ + time.sleep(10) + 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 + """ + time.sleep(10) + try: + self.setUp() + with grpc.insecure_channel("localhost:50051") as channel: + stub = backend_pb2_grpc.BackendStub(channel) + response = stub.LoadModel(backend_pb2.ModelOptions(Model="runwayml/stable-diffusion-v1-5", PipelineType="StableDiffusionPipeline")) + 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(self): + """ + This method tests if the backend can generate images + """ + time.sleep(10) + try: + self.setUp() + with grpc.insecure_channel("localhost:50051") as channel: + stub = backend_pb2_grpc.BackendStub(channel) + response = stub.LoadModel(backend_pb2.ModelOptions(Model="runwayml/stable-diffusion-v1-5", PipelineType="StableDiffusionPipeline")) + print(response.message) + self.assertTrue(response.success) + image_req = backend_pb2.GenerateImageRequest(positive_prompt="cat", width=16,height=16, dst="test.jpg") + re = stub.GenerateImage(image_req) + self.assertTrue(re.success) + except Exception as err: + print(err) + self.fail("Image gen service failed") + finally: + self.tearDown() \ No newline at end of file diff --git a/backend/python/diffusers/test.sh b/backend/python/diffusers/test.sh new file mode 100644 index 00000000..421a1921 --- /dev/null +++ b/backend/python/diffusers/test.sh @@ -0,0 +1,14 @@ +#!/bin/bash + +## +## A bash script wrapper that runs the diffusers server with conda + +export PATH=$PATH:/opt/conda/bin + +# Activate conda environment +source activate diffusers + +# 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.py \ No newline at end of file diff --git a/backend/python/sentencetransformers/test_sentencetransformers.py b/backend/python/sentencetransformers/test_sentencetransformers.py index f935365e..4790ae74 100644 --- a/backend/python/sentencetransformers/test_sentencetransformers.py +++ b/backend/python/sentencetransformers/test_sentencetransformers.py @@ -24,7 +24,7 @@ class TestBackendServicer(unittest.TestCase): """ This method tears down the gRPC service by terminating the server """ - self.service.terminate() + self.service.kill() self.service.wait() def test_server_startup(self): diff --git a/backend/python/transformers/test_transformers_server.py b/backend/python/transformers/test_transformers_server.py index ac4fac28..13d753e9 100644 --- a/backend/python/transformers/test_transformers_server.py +++ b/backend/python/transformers/test_transformers_server.py @@ -24,7 +24,7 @@ class TestBackendServicer(unittest.TestCase): """ This method tears down the gRPC service by terminating the server """ - self.service.terminate() + self.service.kill() self.service.wait() def test_server_startup(self):