| | 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 |
| |
|