| PYTHON_VERSION ?= 3.10 |
| PYTHON ?= python$(PYTHON_VERSION) |
| PIP ?= $(PYTHON) -m pip |
| PIPENV ?= $(PYTHON) -m pipenv |
| PIPENV_PYTHON = $(PIPENV) run python |
| PIPENV_PIP = $(PIPENV_PYTHON) -m pip |
| PWD = $(shell pwd) |
| DOCKER_IMAGE ?= gcr.io/vorvan/h2oai/h2o-llmstudio:nightly |
|
|
| ifeq ($(origin H2O_LLM_STUDIO_WORKDIR), environment) |
| WORKDIR := $(H2O_LLM_STUDIO_WORKDIR) |
| else |
| WORKDIR := $(shell pwd) |
| endif |
|
|
| ifeq ($(LOG_LEVEL), $(filter $(LOG_LEVEL), debug trace)) |
| PW_DEBUG = DEBUG=pw:api |
| else |
| PW_DEBUG = |
| endif |
|
|
| PHONY: pipenv |
| pipenv: |
| $(PIP) install pip==24.0 |
| $(PIP) install pipenv==2023.12.1 |
|
|
| .PHONY: setup |
| setup: pipenv |
| $(PIPENV) install --verbose --python $(PYTHON_VERSION) |
| -$(PIPENV_PIP) install flash-attn==2.5.5 --no-build-isolation --upgrade --no-cache-dir |
|
|
| .PHONY: setup-dev |
| setup-dev: pipenv |
| $(PIPENV) install --verbose --dev --python $(PYTHON_VERSION) |
| - $(PIPENV_PIP) install flash-attn==2.5.5 --no-build-isolation --upgrade --no-cache-dir |
| $(PIPENV) run playwright install |
|
|
| .PHONY: setup-no-flash |
| setup-no-flash: pipenv |
| $(PIPENV) install --verbose --python $(PYTHON_VERSION) |
|
|
| setup-ui: pipenv |
| $(PIPENV) install --verbose --categories=dev-packages --python $(PYTHON_VERSION) |
| $(PIPENV) run playwright install |
|
|
| .PHONY: export-requirements |
| export-requirements: pipenv |
| $(PIPENV) requirements > requirements.txt |
|
|
| clean-env: |
| $(PIPENV) --rm |
|
|
| clean-data: |
| rm -rf data |
|
|
| clean-output: |
| rm -rf output |
|
|
| reports: |
| mkdir -p reports |
|
|
| .PHONY: style |
| style: reports pipenv |
| @echo -n > reports/flake8_errors.log |
| @echo -n > reports/mypy_errors.log |
| @echo -n > reports/mypy.log |
| @echo |
|
|
| -$(PIPENV) run flake8 | tee -a reports/flake8_errors.log |
| @if [ -s reports/flake8_errors.log ]; then exit 1; fi |
|
|
| -$(PIPENV) run mypy . --check-untyped-defs | tee -a reports/mypy.log |
| @if ! grep -Eq "Success: no issues found in [0-9]+ source files" reports/mypy.log ; then exit 1; fi |
|
|
| .PHONY: format |
| format: pipenv |
| $(PIPENV) run isort . |
| $(PIPENV) run black . |
|
|
| .PHONY: isort |
| isort: pipenv |
| $(PIPENV) run isort . |
|
|
| .PHONY: black |
| black: pipenv |
| $(PIPENV) run black . |
|
|
| .PHONY: test |
| test: reports |
| @bash -c 'set -o pipefail; export PYTHONPATH=$(PWD); \ |
| $(PIPENV) run pytest -v --junitxml=reports/junit.xml \ |
| --import-mode importlib \ |
| --html=./reports/pytest.html \ |
| --cov=llm_studio \ |
| --cov-report term \ |
| --cov-report html:./reports/coverage.html \ |
| -o log_cli=true -o log_level=INFO -o log_file=reports/tests.log \ |
| tests/* 2>&1 | tee reports/tests.log' |
|
|
| .PHONY: test-ui |
| test-ui: reports setup-ui |
| $(PW_DEBUG) $(PIPENV) run pytest \ |
| -v \ |
| --junitxml=reports/junit_ui.xml \ |
| --html=./reports/pytest_ui.html \ |
| -o log_cli=true \ |
| -o log_level=$(LOG_LEVEL) \ |
| -o log_file=reports/tests_ui.log \ |
| tests/ui/test.py 2>&1 | tee reports/tests_ui.log |
|
|
| .PHONY: test-ui-headed |
| test-ui-headed: setup-ui |
| $(PW_DEBUG) $(PIPENV) run pytest \ |
| -vvs \ |
| --headed \ |
| --video=on \ |
| --screenshot=on \ |
| --slowmo=100 \ |
| tests/ui/test.py 2>&1 | tee reports/tests.log |
|
|
| .PHONY: wave |
| wave: |
| HF_HUB_ENABLE_HF_TRANSFER=True \ |
| H2O_WAVE_APP_ADDRESS=http://127.0.0.1:8756 \ |
| H2O_WAVE_MAX_REQUEST_SIZE=25MB \ |
| H2O_WAVE_NO_LOG=true \ |
| H2O_WAVE_PRIVATE_DIR="/download/@$(WORKDIR)/output/download" \ |
| $(PIPENV) run wave run app |
|
|
| .PHONY: llmstudio |
| llmstudio: |
| H2O_WAVE_APP_ADDRESS=http://127.0.0.1:8756 \ |
| H2O_WAVE_MAX_REQUEST_SIZE=25MB \ |
| H2O_WAVE_NO_LOG=true \ |
| H2O_WAVE_PRIVATE_DIR="/download/@$(WORKDIR)/output/download" \ |
| $(PIPENV) run wave run --no-reload app |
|
|
| .PHONY: docker-build-nightly |
| docker-build-nightly: |
| docker build -t $(DOCKER_IMAGE) . |
|
|
| .PHONY: docker-run-nightly |
| docker-run-nightly: |
| ifeq (,$(wildcard ./data)) |
| mkdir data |
| endif |
| ifeq (,$(wildcard ./output)) |
| mkdir output |
| endif |
| docker run \ |
| --runtime=nvidia \ |
| --shm-size=64g \ |
| --init \ |
| --rm \ |
| -u `id -u`:`id -g` \ |
| -p 10101:10101 \ |
| -v `pwd`/data:/workspace/data \ |
| -v `pwd`/output:/workspace/output \ |
| $(DOCKER_IMAGE) |
|
|
| .PHONY: docker-clean-all |
| docker-clean-all: |
| @CONTAINERS=$$(docker ps -a -q --filter ancestor=$(DOCKER_IMAGE)); \ |
| if [ -n "$$CONTAINERS" ]; then \ |
| docker stop $$CONTAINERS; \ |
| docker rm $$CONTAINERS; \ |
| fi |
| docker rmi $(DOCKER_IMAGE) |
|
|
| .PHONY: shell |
| shell: |
| $(PIPENV) shell |
|
|
| setup-doc: # Install documentation dependencies |
| cd documentation && npm install |
|
|
| run-doc: # Run the doc locally |
| cd documentation && npm start |
|
|
| update-documentation-infrastructure: |
| cd documentation && npm update @h2oai/makersaurus |
| cd documentation && npm ls |
|
|
| build-doc-locally: # Bundles your website into static files for production |
| cd documentation && npm run build |
|
|
| serve-doc-locally: # Serves the built website locally |
| cd documentation && npm run serve |
|
|