jax.py 2.42 KB
Newer Older
1
# Copyright (c) 2022-2025, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2
3
4
#
# See LICENSE for license information.

5
6
"""JAX related extensions."""
import os
7
from pathlib import Path
8
from packaging import version
9
10
11

import setuptools

12
from .utils import get_cuda_include_dirs, all_files_in_dir, debug_build_enabled
13
14
from typing import List

15

16
17
def install_requirements() -> List[str]:
    """Install dependencies for TE/JAX extensions."""
18
    return ["jax", "flax>=0.7.1"]
19
20
21
22
23
24
25


def test_requirements() -> List[str]:
    """Test dependencies for TE/JAX extensions."""
    return ["numpy"]


26
27
28
29
30
def xla_path() -> str:
    """XLA root path lookup.
    Throws FileNotFoundError if XLA source is not found."""

    try:
31
32
33
34
35
36
37
        import jax

        if version.parse(jax.__version__) >= version.parse("0.5.0"):
            from jax import ffi  # pylint: disable=ungrouped-imports
        else:
            from jax.extend import ffi  # pylint: disable=ungrouped-imports

38
39
40
41
42
43
44
45
46
47
48
    except ImportError:
        if os.getenv("XLA_HOME"):
            xla_home = Path(os.getenv("XLA_HOME"))
        else:
            xla_home = "/opt/xla"
    else:
        xla_home = ffi.include_dir()

    if not os.path.isdir(xla_home):
        raise FileNotFoundError("Could not find xla source.")
    return xla_home
49

50
51
52
53
54
55
56
57
58

def setup_jax_extension(
    csrc_source_files,
    csrc_header_files,
    common_header_files,
) -> setuptools.Extension:
    """Setup PyBind11 extension for JAX support"""
    # Source files
    csrc_source_files = Path(csrc_source_files)
59
    extensions_dir = csrc_source_files / "extensions"
60
    sources = all_files_in_dir(extensions_dir, name_extension="cpp")
61
62

    # Header files
63
64
65
66
67
68
69
70
71
72
    include_dirs = get_cuda_include_dirs()
    include_dirs.extend(
        [
            common_header_files,
            common_header_files / "common",
            common_header_files / "common" / "include",
            csrc_header_files,
            xla_path(),
        ]
    )
73
74

    # Compile flags
75
    cxx_flags = ["-O3"]
76
77
78
79
80
    if debug_build_enabled():
        cxx_flags.append("-g")
        cxx_flags.append("-UNDEBUG")
    else:
        cxx_flags.append("-g0")
81
82
83
84

    # Define TE/JAX as a Pybind11Extension
    from pybind11.setup_helpers import Pybind11Extension

85
    return Pybind11Extension(
86
87
88
        "transformer_engine_jax",
        sources=[str(path) for path in sources],
        include_dirs=[str(path) for path in include_dirs],
89
        extra_compile_args=cxx_flags,
Phuong Nguyen's avatar
Phuong Nguyen committed
90
        libraries=["nccl"],
91
    )