"examples/language/vscode:/vscode.git/clone" did not exist on "0afb55fc5ba5f517fda2a7872d2ac2170b5ee983"
Commit 8e7feca9 authored by Wenhao Xie's avatar Wenhao Xie Committed by GitHub
Browse files

[Doc] Use sphinx to generate docs. (#21)

* [Doc] Use sphinx to generate docs.

* [Doc] Fix a bug on tlcpack_sphinx_addon.

* [Doc] Fix linting issues.
parent 7b777b38
# Minimal makefile for Sphinx documentation
#
# You can set these variables from the command line, and also
# from the environment for the first two.
SPHINXOPTS ?=
SPHINXBUILD ?= python -m sphinx
SOURCEDIR = .
BUILDDIR = _build
# Put it first so that "make" without argument is like "make help".
help:
@$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
.PHONY: help Makefile
# Catch-all target: route all unknown targets to Sphinx using the new
# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
%: Makefile
@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
# Tile Language Documentation
The documentation was built upon [Sphinx](https://www.sphinx-doc.org/en/master/).
## Dependencies
Run the following command in this directory to install dependencies first:
```bash
pip3 install -r requirements.txt
```
## Build the Documentation
Then you can build the documentation by running:
```bash
make html
```
## View the Documentation
Run the following command to start a simple HTTP server:
```bash
cd _build/html
python3 -m http.server
```
Then you can view the documentation in your browser at `http://localhost:8000` (the port can be customized by appending ` -p PORT_NUMBER` in the python command above).
<svg width="2268" height="537" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" overflow="hidden"><defs><clipPath id="clip0"><rect x="0" y="1440" width="2268" height="537"/></clipPath><image width="401" height="463" xlink:href="data:image/png;base64,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" preserveAspectRatio="none" id="img1"></image><clipPath id="clip2"><rect x="1548" y="1469" width="401" height="463"/></clipPath><linearGradient x1="5.66719" y1="56.5386" x2="5.66719" y2="-222.487" gradientUnits="userSpaceOnUse" spreadMethod="pad" id="fill3"><stop offset="0" stop-color="#E73768"/><stop offset="0.5" stop-color="#FFFFFF"/><stop offset="1" stop-color="#69E0F9"/></linearGradient></defs><g clip-path="url(#clip0)" transform="matrix(1 0 0 1 0 -1440)"><path d="M0 0 2266.88 0 2266.88 1666.82 0 1666.82Z" fill="#0A0619" transform="matrix(1.0005 0 0 1 0 867.18)"/><g clip-path="url(#clip2)"><use width="100%" height="100%" xlink:href="#img1" transform="translate(1548 1469)"></use></g><path d="M155.214-196.218 5.66719-196.218 5.66719-147.014 52.2715-147.014 52.2715 0 108.277 0 108.277-147.014 155.214-147.014ZM203.019-168.482C227.888-168.482 232.088-171.016 232.088-195.952 232.088-220.487 227.888-222.487 203.019-222.487 178.417-222.487 173.883-220.487 173.883-195.952 173.883-171.016 178.417-168.482 203.019-168.482ZM176.15 0 229.821 0 229.821-152.681 176.15-152.681ZM313.829 1.66682C320.296 1.66682 326.564 1.13344 332.764 0L332.764-40.4038C329.631-39.6037 328.764-39.8704 326.83-39.8704 318.03-39.8704 315.229-43.5374 315.229-56.2719L315.229-214.887 261.491-214.887 261.491-43.5374C261.491-12.7345 271.692 1.66682 313.829 1.66682ZM493.646-86.208C493.646-132.879 478.911-155.481 424.64-155.481 374.035-155.481 344.632-139.08 344.632-76.3404 344.632-13.6013 374.035 2.80026 422.106 2.80026 452.309 2.80026 476.644-2.80026 485.979-9.3342L485.979-48.9379C476.911-43.5374 453.442-37.8702 432.84-37.8702 413.305-37.8702 401.171-43.2707 398.037-56.5386L491.912-62.2058C492.779-64.4727 493.646-73.8069 493.646-86.208ZM397.77-93.0087C398.904-111.944 406.838-116.211 424.906-116.211 441.908-116.211 446.108-108.277 446.108-96.6757ZM577.32-48.3378 577.32-196.218 521.049-196.218 521.049 0 649.927 0 649.927-48.3378ZM739.269-155.214C728.268-155.214 711.866-154.614 700.265-152.681L700.265-107.743C710.199-109.41 720.6-110.277 731.668-110.277 754.003-110.277 759.671-108.01 760.471-92.4753L729.135-92.4753C684.73-92.4753 664.662-79.4741 664.662-44.4041 664.662-11.6011 684.73 2.80026 716.667 2.80026 743.536 2.80026 756.537-6.53394 761.071-14.1346L765.271 0 813.942 0 813.942-103.743C813.942-139.346 792.74-155.214 739.269-155.214ZM733.668-37.0034C722.601-37.0034 716.667-39.0036 716.667-46.9377 716.667-56.0052 722.067-58.5388 739.002-58.5388L760.471-58.5388 760.471-46.671C756.27-41.2705 746.936-37.0034 733.668-37.0034ZM949.888-155.481C925.019-155.481 910.351-147.547 902.684-137.146L902.684-152.681 849.012-152.681 849.012 0 902.684 0 902.684-100.676C904.951-108.277 910.885-113.077 924.486-113.077 941.421-113.077 946.221-109.944 946.221-91.0085L946.221 0 999.96 0 999.96-103.21C999.96-140.213 985.825-155.481 949.888-155.481ZM1129.97-152.681 1129.97-139.346C1124.04-150.681 1112.5-155.481 1086.43-155.481 1038.1-155.481 1025.7-119.611 1025.7-77.7406 1025.7-31.4029 1038.1 0 1086.43 0 1112.17 0 1124.04-6.53394 1129.97-17.535L1129.97-13.6013C1129.97 10.7343 1117.84 16.6682 1085.3 16.6682 1072.03 16.6682 1054.76 14.4013 1042.63 11.3344L1042.63 52.8716C1057.03 55.1385 1076.57 56.5386 1090.97 56.5386 1163.38 56.5386 1183.18 29.136 1183.18-12.7345L1183.18-152.681ZM1105.1-37.0034C1083.37-37.0034 1079.97-55.6719 1079.97-77.7406 1079.97-98.4092 1083.37-117.011 1105.1-117.011 1130.84-117.011 1132.57-102.343 1132.57-77.7406 1132.57-51.7382 1130.84-37.0034 1105.1-37.0034Z" fill="url(#fill3)" transform="matrix(1.0005 0 0 1 313.501 1774.2)"/><path d="M0.533383-56.0052 0.533383-46.8044 17.4683-46.8044 17.4683 0 28.2693 0 28.2693-46.8044 45.0709-46.8044 45.0709-56.0052ZM51.0714 0 61.8724 0 61.8724-56.0052 51.0714-56.0052ZM72.8068 0 113.544 0 113.544-10.5343 83.6745-10.5343 83.6745-56.0052 72.8068-56.0052ZM120.078 0 161.548 0 161.548-10.5343 130.946-10.5343 130.946-23.6689 158.948-23.6689 158.948-33.6031 130.946-33.6031 130.946-45.5376 161.548-45.5376 161.548-56.0052 120.078-56.0052ZM192.285 0 232.955 0 232.955-10.5343 203.152-10.5343 203.152-56.0052 192.285-56.0052ZM268.492-56.0052 254.824-56.0052 234.755 0 246.423 0 249.957-10.401 274.292-10.401 278.026 0 290.494 0ZM252.757-18.8018 261.291-44.4041 262.091-44.4041 271.292-18.8018ZM296.361 0 306.829 0 306.829-38.0702 307.229-38.0702 334.164 0 344.765 0 344.765-56.0052 334.431-56.0052 334.431-17.4683 334.031-17.4683 306.962-56.0052 296.361-56.0052ZM400.571-8.40078 400.171 0 410.305 0C410.305-0.400037 410.305-29.4694 410.305-29.8694L380.502-29.8694 380.502-22.002 400.371-22.002C399.571-15.2014 392.57-8.13409 382.436-8.13409 370.034-8.13409 363.767-16.8016 363.767-28.0026 363.767-38.8703 371.301-47.2711 382.502-47.2711 391.103-47.2711 396.57-43.2707 398.704-36.8701L410.105-36.8701C407.371-50.8714 397.704-56.8053 382.436-56.8053 364.567-56.8053 353.3-45.6042 353.3-28.0026 353.3-10.4676 363.501 0.800074 381.302 0.800074 394.037 0.800074 398.904-5.33383 400.171-8.40078ZM455.509-21.8687C455.509-13.868 450.175-9.73424 442.508-9.73424 434.574-9.73424 430.107-13.868 430.107-21.8687L430.107-56.0052 419.172-56.0052 419.172-20.2686C419.172-5.93389 430.04 0.800074 442.575 0.800074 455.576 0.800074 466.11-5.93389 466.11-20.2686L466.11-56.0052 455.509-56.0052ZM503.18-56.0052 489.512-56.0052 469.377 0 481.111 0 484.578-10.401 508.914-10.401 512.714 0 525.182 0ZM487.379-18.8018 495.979-44.4041 496.78-44.4041 505.98-18.8018ZM573.387-8.40078 572.987 0 583.121 0C583.121-0.400037 583.121-29.4694 583.121-29.8694L553.318-29.8694 553.318-22.002 573.187-22.002C572.387-15.2014 565.386-8.13409 555.252-8.13409 542.851-8.13409 536.583-16.8016 536.583-28.0026 536.583-38.8703 544.117-47.2711 555.318-47.2711 563.919-47.2711 569.386-43.2707 571.52-36.8701L582.921-36.8701C580.187-50.8714 570.52-56.8053 555.252-56.8053 537.383-56.8053 526.116-45.6042 526.116-28.0026 526.116-10.4676 536.317 0.800074 554.118 0.800074 566.853 0.800074 571.72-5.33383 572.987-8.40078ZM592.455 0 633.926 0 633.926-10.5343 603.323-10.5343 603.323-23.6689 631.325-23.6689 631.325-33.6031 603.323-33.6031 603.323-45.5376 633.926-45.5376 633.926-56.0052 592.455-56.0052Z" fill="#FFFFFF" transform="matrix(1.0005 0 0 1 590.804 1927.55)"/></g></svg>
\ No newline at end of file
# -*- coding: utf-8 -*-
import os
import sys
import tlcpack_sphinx_addon
# -- General configuration ------------------------------------------------
sys.path.insert(0, os.path.abspath("../tilelang"))
sys.path.insert(0, os.path.abspath("../"))
autodoc_mock_imports = ["torch"]
# General information about the project.
project = "tilelang"
author = "Tile Lang Contributors"
copyright = "2025-2025, %s" % author
# Version information.
version = "0.1.0"
release = "0.1.0"
extensions = [
"sphinx_tabs.tabs",
"sphinx_toolbox.collapse",
"sphinxcontrib.httpdomain",
"sphinx.ext.autodoc",
"sphinx.ext.napoleon",
"sphinx_reredirects",
]
redirects = {"get_started/try_out": "../index.html#getting-started"}
source_suffix = [".rst"]
language = "en"
exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"]
# The name of the Pygments (syntax highlighting) style to use.
pygments_style = "sphinx"
# A list of ignored prefixes for module index sorting.
# If true, `todo` and `todoList` produce output, else they produce nothing.
todo_include_todos = False
# -- Options for HTML output ----------------------------------------------
# The theme is set by the make target
import sphinx_rtd_theme
html_theme = "sphinx_rtd_theme"
html_theme_path = [sphinx_rtd_theme.get_html_theme_path()]
templates_path = []
html_static_path = []
footer_copyright = "© 2025-2025 Tile Language"
footer_note = " "
html_logo = "_static/img/logo-row.svg"
html_theme_options = {
"logo_only": True,
}
header_links = [
("Home", "https://github.com/tile-ai/tilelang"),
("Github", "https://github.com/tile-ai/tilelang"),
]
html_context = {
"footer_copyright": footer_copyright,
"footer_note": footer_note,
"header_links": header_links,
"display_github": True,
"github_user": "tile-ai",
"github_repo": "tilelang",
"github_version": "main/docs/",
"theme_vcs_pageview_mode": "edit",
# "header_logo": "/path/to/logo",
# "header_logo_link": "",
# "version_selecter": "",
}
# add additional overrides
templates_path += [tlcpack_sphinx_addon.get_templates_path()]
html_static_path += [tlcpack_sphinx_addon.get_static_path()]
Installation Guide
==================
Installing with pip
-------------------
**Prerequisites for installation via wheel or PyPI:**
- **Operating System**: Ubuntu 20.04 or later
- **Python Version**: >= 3.8
- **CUDA Version**: >= 11.0
The easiest way to install TileLang is directly from PyPI using pip. To install the latest version, run the following command in your terminal:
.. code:: bash
pip install tilelang
Alternatively, you may choose to install TileLang using prebuilt packages available on the Release Page:
.. code:: bash
pip install tilelang-0.0.0.dev0+ubuntu.20.4.cu120-py3-none-any.whl
To install the latest version of TileLang from the GitHub repository, you can run the following command:
.. code:: bash
pip install git+https://github.com/tile-ai/tilelang.git
After installing TileLang, you can verify the installation by running:
.. code:: bash
python -c "import tilelang; print(tilelang.__version__)"
Building from Source
--------------------
**Prerequisites for building from source:**
- **Operating System**: Linux
- **Python Version**: >= 3.7
- **CUDA Version**: >= 10.0
We recommend using a Docker container with the necessary dependencies to build TileLang from source. You can use the following command to run a Docker container with the required dependencies:
.. code:: bash
docker run --gpus all -it --rm --ipc=host nvcr.io/nvidia/pytorch:23.01-py3
To build and install TileLang directly from source, follow these steps. This process requires certain pre-requisites from Apache TVM, which can be installed on Ubuntu/Debian-based systems using the following commands:
.. code:: bash
sudo apt-get update
sudo apt-get install -y python3 python3-dev python3-setuptools gcc libtinfo-dev zlib1g-dev build-essential cmake libedit-dev libxml2-dev
After installing the prerequisites, you can clone the TileLang repository and install it using pip:
.. code:: bash
git clone --recursive https://github.com/tile-ai/tilelang.git
cd TileLang
pip install . # Please be patient, this may take some time.
If you want to install TileLang in development mode, you can run the following command:
.. code:: bash
pip install -e .
We currently provide three methods to install **TileLang**:
1. Install from Source (using your own TVM installation)
2. Install from Source (using the bundled TVM submodule)
3. Install Using the Provided Script
Method 1: Install from Source (Using Your Own TVM Installation)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
If you already have a compatible TVM installation, follow these steps:
1. **Clone the Repository**:
.. code:: bash
git clone --recursive https://github.com/tile-ai/tilelang
cd TileLang
**Note**: Use the `--recursive` flag to include necessary submodules.
2. **Configure Build Options**:
Create a build directory and specify your existing TVM path:
.. code:: bash
mkdir build
cd build
cmake .. -DTVM_PREBUILD_PATH=/your/path/to/tvm/build # e.g., /workspace/tvm/build
make -j 16
3. **Set Environment Variables**:
Update `PYTHONPATH` to include the `tile-lang` Python module:
.. code:: bash
export PYTHONPATH=/your/path/to/tile-lang/python:$PYTHONPATH
# TVM_IMPORT_PYTHON_PATH is used by 3rd-party frameworks to import TVM
export TVM_IMPORT_PYTHON_PATH=/your/path/to/tvm/python
Method 2: Install from Source (Using the Bundled TVM Submodule)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
If you prefer to use the built-in TVM version, follow these instructions:
1. **Clone the Repository**:
.. code:: bash
git clone --recursive https://github.com/tile-ai/tilelang
cd TileLang
**Note**: Ensure the `--recursive` flag is included to fetch submodules.
2. **Configure Build Options**:
Copy the configuration file and enable the desired backends (e.g., LLVM and CUDA):
.. code:: bash
mkdir build
cp 3rdparty/tvm/cmake/config.cmake build
cd build
echo "set(USE_LLVM ON)" >> config.cmake
echo "set(USE_CUDA ON)" >> config.cmake
# or echo "set(USE_ROCM ON)" >> config.cmake to enable ROCm runtime
cmake ..
make -j 16
The build outputs (e.g., `libtilelang.so`, `libtvm.so`, `libtvm_runtime.so`) will be generated in the `build` directory.
3. **Set Environment Variables**:
Ensure the `tile-lang` Python package is in your `PYTHONPATH`:
.. code:: bash
export PYTHONPATH=/your/path/to/TileLang/python:$PYTHONPATH
Method 3: Install Using the Provided Script
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
For a simplified installation, use the provided script:
1. **Clone the Repository**:
.. code:: bash
git clone --recursive https://github.com/tile-ai/tilelang
cd TileLang
2. **Run the Installation Script**:
.. code:: bash
bash install.sh
# or bash `install_amd.sh` if you want to enable ROCm runtime
Language reference
=========================
T.Kernel
--------
args: the grid size (0-3 dimension) and the num_threads.
returns: the blockIdx variables
launch a kernel, it must be used in a with statement. There can be
multiple kernels launched sequentially inside a prim function.
T.alloc_shared
--------------
args: shape, dtype
returns: Buffer
Allocate buffer on shared memory, It must be used within T.Kernel scope
and should be allocated at the top of the scope.
Dynamic shared memory is used.
T.alloc_fragment
----------------
args: shape, dtype
returns: Buffer
Allocate buffer on register memory, It must be used within T.Kernel
scope and should be allocated at the top of the scope.
The shape represents the whole shape of the buffer. Each element in the
buffer is distributed stored on each threads, this storage partition
will be inferred by the compiler.
T.copy
------
args: src, dst
Copies data from src to dst, src and dst can be one of (Buffer,
BufferLoad, BufferRegion). If you use BufferLoad that represents a
single starting point, the other params should not be BufferLoad, since
we need to know the copy region.
Zero will be padded if we detect the load is out of boundary.
T.gemm
------
args: A, B, C, transpose_A, transpose_B, policy
Performs gemm operation on A, B and C. C must be a fragment, B must be
on shared memory, A can be either a fragment or shared.
Note that the current implementation has some shape and dtype
constraints, for example, the length of reduction axis must be a
multiple of 32 for fp16 multiplicand case, we will update this later.
T.reduce_max T.reduce_sum
-------------------------
args: src, dst, dim
Performs a reduce operation from src to dst on dimension dim. Currently
we only support src and dst to be a fragment.
T.Parallel
----------
You can use T.Parallel to write a loop. The loop will be partitioned to
all the threads by the compiler (The compiler will consider vectorize
size, the fragment’s thread mapping … ). Note that this is the only way
you can perform arbitrary operation on fragments.
T.Pipelined
-----------
args: start, stop, num_stages
Pipeline the loop, copy from the global memory will be converted to
async operations and reordered to the point after it is consumed.
num_stages is the number of buffer between producer-consumer.
(e.g.&nbsp;Double buffer when num_stages=2)
T.clear T.fill
--------------
nothing special, they will be converted to T.Parallel
T.use_swizzle
-------------
Optimization for L2 cache. The launch of blockIdx.x and blockIdx.y will
be serpentined.
You need to add it in a kernel after buffer is all allocated.
👋 Welcome to Tile Language
===========================
`GitHub <https://github.com/tile-ai/tilelang>`_
Tile Language (tile-lang) is a concise domain-specific language designed to streamline
the development of high-performance GPU/CPU kernels (e.g., GEMM, Dequant GEMM, FlashAttention, LinearAttention).
By employing a Pythonic syntax with an underlying compiler infrastructure on top of TVM,
tile-lang allows developers to focus on productivity without sacrificing the
low-level optimizations necessary for state-of-the-art performance.
.. toctree::
:maxdepth: 2
:caption: Get Started
:hidden:
get_started/Installation.rst
get_started/language_ref.rst
.. toctree::
:maxdepth: 1
:caption: Privacy
:hidden:
privacy.rst
@ECHO OFF
pushd %~dp0
REM Command file for Sphinx documentation
if "%SPHINXBUILD%" == "" (
set SPHINXBUILD=sphinx-build
)
set SOURCEDIR=.
set BUILDDIR=_build
%SPHINXBUILD% >NUL 2>NUL
if errorlevel 9009 (
echo.
echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
echo.installed, then set the SPHINXBUILD environment variable to point
echo.to the full path of the 'sphinx-build' executable. Alternatively you
echo.may add the Sphinx directory to PATH.
echo.
echo.If you don't have Sphinx installed, grab it from
echo.https://www.sphinx-doc.org/
exit /b 1
)
if "%1" == "" goto help
%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
goto end
:help
%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
:end
popd
Privacy
====================
All data stays in users' device and is not collected by the app.
fastapi
pydantic
sphinx == 5.2.3
sphinx-reredirects==0.1.2
sphinx-rtd-theme
sphinx-tabs == 3.4.1
sphinx-toolbox == 3.4.0
sphinxcontrib-napoleon==0.7
sphinxcontrib_httpdomain==1.8.1
git+https://github.com/xwhzz/tlcpack-sphinx-addon.git
uvicorn
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment