diff --git a/docs/source/getting_started/installation.rst b/docs/source/getting_started/installation.rst index afae6e6556021..bdde3e933b18f 100644 --- a/docs/source/getting_started/installation.rst +++ b/docs/source/getting_started/installation.rst @@ -58,13 +58,41 @@ You can install vLLM using pip: $ # export VLLM_COMMIT=... $ # pip install https://vllm-wheels.s3.us-west-2.amazonaws.com/${VLLM_COMMIT}/vllm-${VLLM_VERSION}-cp38-abi3-manylinux1_x86_64.whl +Build from source (without compilation) +--------------------------------------- + +If you want to develop vLLM, and you only need to change the Python code, you can build vLLM without compilation. + +The first step is to follow the previous instructions to install the latest vLLM wheel: + +.. code-block:: console + + $ export VLLM_VERSION=0.6.1.post1 + $ pip install https://vllm-wheels.s3.us-west-2.amazonaws.com/nightly/vllm-${VLLM_VERSION}-cp38-abi3-manylinux1_x86_64.whl + +After verifying that the installation is successful, we have a script for you to copy and link directories, so that you can edit the Python code directly: + +.. code-block:: console + + $ git clone https://github.com/vllm-project/vllm.git + $ cd vllm + $ python python_only_dev.py + +It will: + +- Find the installed vLLM in the current environment. +- Copy built files to the current directory. +- Rename the installed vLLM +- Symbolically link the current directory to the installed vLLM. + +This way, you can edit the Python code in the current directory, and the changes will be reflected in the installed vLLM. .. _build_from_source: -Build from source ------------------ +Build from source (with compilation) +------------------------------------ -You can also build and install vLLM from source: +If you need to touch the C++ or CUDA code, you need to build vLLM from source: .. code-block:: console diff --git a/python_only_dev.py b/python_only_dev.py new file mode 100644 index 0000000000000..d84122280a3c2 --- /dev/null +++ b/python_only_dev.py @@ -0,0 +1,54 @@ +# enable python only development +# copy compiled files to the current directory directly + +import os +import shutil +import subprocess +import sys + +# cannot directly `import vllm` , because it will try to +# import from the current directory +output = subprocess.run([sys.executable, "-m", "pip", "show", "vllm"], + capture_output=True) + +assert output.returncode == 0, "vllm is not installed" + +text = output.stdout.decode("utf-8") + +package_path = None +for line in text.split("\n"): + if line.startswith("Location: "): + package_path = line.split(": ")[1] + break + +assert package_path is not None, "could not find package path" + +cwd = os.getcwd() + +assert cwd != package_path, "should not import from the current directory" + +files_to_copy = [ + "vllm/_C.abi3.so", + "vllm/_core_C.abi3.so", + "vllm/_moe_C.abi3.so", + "vllm/vllm_flash_attn/vllm_flash_attn_c.abi3.so", + "vllm/vllm_flash_attn/flash_attn_interface.py", + "vllm/vllm_flash_attn/__init__.py", + # "vllm/_version.py", # not available in nightly wheels yet +] + +for file in files_to_copy: + src = os.path.join(package_path, file) + dst = file + print(f"Copying {src} to {dst}") + shutil.copyfile(src, dst) + +pre_built_vllm_path = os.path.join(package_path, "vllm") +tmp_path = os.path.join(package_path, "vllm_pre_built") +current_vllm_path = os.path.join(cwd, "vllm") + +print(f"Renaming {pre_built_vllm_path} to {tmp_path}") +os.rename(pre_built_vllm_path, tmp_path) + +print(f"linking {current_vllm_path} to {pre_built_vllm_path}") +os.symlink(current_vllm_path, pre_built_vllm_path)