Documentation
¶
Overview ¶
Package installer provides functionality to install PJRT plugins.
The API exposes several functions to install the different PJRT plugins individually, and it is used the command-line program github.com/gomlx/go-xla/cmd/pjrt_installer.
External users may be interested in the using the AutoInstall function to automatically install the PRJT plugin for the current platform.
By default, the functions are only available to the corresponding platforms (currently only Linux/amd64 and Darwin/arm64). If you use the tag `pjrt_all`, all functions will be available. The AutoInstall function is an exception, it is platform-specific and the tag `pjrt_all` has no effect on it.
Index ¶
- Constants
- Variables
- func AutoInstall(installPath string, useCache bool, verbosity VerbosityLevel) error
- func CPUAutoInstall(goxlaInstallPath string, useCache bool, verbosity VerbosityLevel) error
- func CPUGetDownloadURL(platform, version string) (url string, err error)
- func CPUInstall(platform, version, installPath string, useCache bool, verbosity VerbosityLevel) error
- func CPUValidateVersion(platform, version string) error
- func CudaAutoInstall(goxlaInstallPath string, useCache bool, verbosity VerbosityLevel) error
- func CudaInstall(plugin, version, installPath string, useCache bool, verbosity VerbosityLevel) error
- func CudaInstallNvidiaLibraries(plugin, version, nvidiaSubdir string, useCache bool, verbosity VerbosityLevel) error
- func CudaInstallPJRT(plugin, version, installPath string, useCache bool, verbosity VerbosityLevel) (string, error)
- func CudaValidateVersion(plugin, version string) error
- func DefaultHomeLibPath() (string, error)
- func DownloadURLToTemp(url, fileName, wantSHA256 string, useCache bool, verbosity VerbosityLevel) (filePath string, cached bool, err error)
- func ExtractDirFromZip(zipFilePath, dirInZipFile, outputPath string) error
- func ExtractFileFromZip(zipFilePath, fileName, outputPath string) error
- func GetCachePath(fileName string) (filePath string, cached bool, err error)
- func GitHubDownloadReleaseAssets(repo string, version string) ([]string, error)
- func GitHubGetLatestVersion() (string, error)
- func GitHubGetVersions(repo string) ([]string, error)
- func PipCompareVersion(v1, v2 string) int
- func PipPackageLinuxAMD64() *regexp.Regexp
- func PipPackageLinuxAMD64Glibc231() *regexp.Regexp
- func ReplaceTildeInDir(dir string) (string, error)
- func ReportError(err error)
- func TPUAutoInstall(goxlaInstallPath string, useCache bool, verbosity VerbosityLevel) error
- func TPUInstall(plugin, version, installPath string, useCache bool, verbosity VerbosityLevel) error
- func TPUValidateVersion(plugin, version string) error
- func Untar(tarballPath, outputDirPath string) ([]string, error)
- func Unzip(zipPath, outputDirPath string) ([]string, error)
- type AutoInstaller
- type PipDependency
- type PipPackageInfo
- type PipReleaseInfo
- type Spinner
- type VerbosityLevel
Constants ¶
const AmazonLinux = "amazonlinux"
const BinaryCPUReleasesRepo = "gomlx/pjrt-cpu-binaries"
const DeleteToEndOfLine = "\x1b[J"
const TPUPJRTPluginName = "pjrt_c_api_tpu_plugin.so"
Variables ¶
var CPUSupportedPlatforms = []string{
"linux_amd64", "linux_arm64",
"darwin_arm64",
"windows_amd64",
}
var HasNvidiaGPU = sync.OnceValue[bool](func() bool { matches, err := filepath.Glob("/dev/nvidia*") if err != nil { klog.Errorf("Failed to figure out if there is an Nvidia GPU installed while searching for files matching \"/dev/nvidia*\": %v", err) } else if len(matches) > 0 { return true } _, lookErr := exec.LookPath("nvidia-smi") if lookErr != nil { return false } cmd := exec.Command("nvidia-smi") output, cmdErr := cmd.CombinedOutput() if cmdErr != nil { return false } return strings.Contains(string(output), "NVIDIA-SMI") })
HasNvidiaGPU tries to guess if there is an actual Nvidia GPU installed (as opposed to only the drivers/PJRT file installed, but no actual hardware). It does that by checking for the presence of the device files in /dev/nvidia*.
var HasTPU = sync.OnceValue(func() bool { if _, err := os.Stat("/lib/libtpu.so"); err == nil { return true } if _, err := os.Stat("/usr/lib/libtpu.so"); err == nil { return true } if _, err := os.Stat("/usr/local/lib/libtpu.so"); err == nil { return true } return false })
HasTPU checks if a TPU is available on the system. This uses sync.OnceValue for efficient repeated calls.
Functions ¶
func AutoInstall ¶
func AutoInstall(installPath string, useCache bool, verbosity VerbosityLevel) error
AutoInstall automatically installs the PJRT plugin for the current platform, if the corresponding hardware is present.
It returns the first error encountered, or nil if no error occurred.
- installPath should point to a "lib" directory, under which an "go-xla" subdirectory is created, and the PJRT plugins are installed (e.g.: "~/.local/lib", "/usr/local/lib/"). If it is set to "", it is set to the default user-local library directory ( in Linux is $HOME/.local/lib/, and on MacOS is $HOME/Library/Application Support/).
- useCache: if true, it will use the cache to store downloaded files. Recommended to keep it true.
- verbosity: the verbosity level to use. 0=quiet, 1=normal (1 log line per plugin installed), 2=verbose.
func CPUAutoInstall ¶
func CPUAutoInstall(goxlaInstallPath string, useCache bool, verbosity VerbosityLevel) error
CPUAutoInstall installs the latest version of the CPU PJRT if not yet installed. goxlaInstallPath is expected to be a "lib/go-xla" directory, under which the PJRT plugin is installed.
func CPUGetDownloadURL ¶
CPUGetDownloadURL returns the download URL for the given version and plugin.
func CPUInstall ¶
func CPUInstall(platform, version, installPath string, useCache bool, verbosity VerbosityLevel) error
CPUInstall the assets on the target directory.
func CPUValidateVersion ¶
CPUValidateVersion checks whether the linux version selected by "-version" exists.
func CudaAutoInstall ¶
func CudaAutoInstall(goxlaInstallPath string, useCache bool, verbosity VerbosityLevel) error
CudaAutoInstall installs the latest version of the CUDA PJRT and Nvidia libraries if not yet installed, and there is an actual Nvidia GPU installed.
It uses HasNvidiaGPU to see if there is an actual Nvidia GPU installed.
goxlaInstallPath is expected to be a "lib/go-xla" directory, under which the nvidia/ subdirectory will be (is already) created, and the CUDA PJRT plugin is installed.
func CudaInstall ¶
func CudaInstall(plugin, version, installPath string, useCache bool, verbosity VerbosityLevel) error
CudaInstall installs the cuda PJRT from the Jax PIP packages, using pypi.org distributed files.
Checks performed: - Version exists - Author email is from the Jax team - Downloaded files sha256 match the ones on pypi.org
If useCache is true, it will save the file in a cache directory and try to reuse it if already downloaded ¶
The installPath parameter should be to the .../lib/go-xla directory. The pjrt plugin itself will be installed under the .../lib/go-xla/nvidia directory -- it needs to be there due to path resolution issues with the plugin/Nvidia libraries.
func CudaInstallNvidiaLibraries ¶
func CudaInstallNvidiaLibraries(plugin, version, nvidiaSubdir string, useCache bool, verbosity VerbosityLevel) error
CudaInstallNvidiaLibraries installs the required NVIDIA libraries for CUDA.
func CudaInstallPJRT ¶
func CudaInstallPJRT(plugin, version, installPath string, useCache bool, verbosity VerbosityLevel) (string, error)
CudaInstallPJRT installs the cuda PJRT from the Jax PIP packages, using pypi.org distributed files.
Checks performed: - Version exists - Author email is from the Jax team - Downloaded files sha256 match the ones on pypi.org
If useCache is true, it will save the file in a cache directory and try to reuse it if already downloaded.
Returns the version that was installed -- it can be different if the requested version was "latest", in which case it is translated to the actual version.
func CudaValidateVersion ¶
CudaValidateVersion checks whether the cuda version selected by "-version" exists.
func DefaultHomeLibPath ¶ added in v0.1.4
DefaultHomeLibPath returns the default user-local library directory ("~/.local/lib" in Linux)
This is the directory used by AutoInstall if the installPath is empty.
func DownloadURLToTemp ¶
func DownloadURLToTemp(url, fileName, wantSHA256 string, useCache bool, verbosity VerbosityLevel) ( filePath string, cached bool, err error)
DownloadURLToTemp downloads a file from a given URL to a temporary file.
It displays a spinner while downloading and outputs some information about the download.
If useCache is true, it will save the file in a cache directory and try to reuse it if already downloaded.
If wantSHA256 is not empty, it will verify the hash of the downloaded file.
It returns the path where the file was downloaded, and if the downloaded file is in a cache (so it shouldn't be removed after use).
func ExtractDirFromZip ¶
ExtractDirFromZip extracts from zipFilePath all files and directories under dirInZipFile and saves them with the same directory structure under outputPath.
Notice dirInZipFile is not repeated in outputPath.
func ExtractFileFromZip ¶
ExtractFileFromZip searches for a file named fileName within the zipFilePath and extracts the first one found to the outputPath.
The fileName is matched to the full path of the files in the zip archive as well as to the base name: so a base name can be given, and it will find it anywhere in the zip archive.
func GetCachePath ¶
GetCachePath finds and prepares the cache directory for gopjrt.
It uses os.UserCacheDir() for portability:
- Linux: $XDG_CACHE_HOME or $HOME/.cache - Darwin: $HOME/Library/Caches - Windows: %LocalAppData% (e.g., C:\Users\user\AppData\Local)
func GitHubDownloadReleaseAssets ¶
GitHubDownloadReleaseAssets downloads the list of assets available for the given repository/release version. E.g.: repo = "gomlx/pjrt-cpu-binaries", version = "v0.83.1"
func GitHubGetLatestVersion ¶
GitHubGetLatestVersion returns the latest version tag from the gomlx/pjrt-cpu-binaries repository.
func GitHubGetVersions ¶
func PipCompareVersion ¶
PipCompareVersion compares two PIP version strings (they include only numbers separated by dots).
func PipPackageLinuxAMD64 ¶
PipPackageLinuxAMD64 returns the regexp for matching Linux AMD64 packages.
func PipPackageLinuxAMD64Glibc231 ¶
PipPackageLinuxAMD64Glibc231 returns the regexp for matching Linux AMD64 packages with glibc 2.31.
func ReplaceTildeInDir ¶
ReplaceTildeInDir replaces "~" in a directory path with the user's home directory. Returns dir if it doesn't start with "~". It may panic with an error if `dir` has an unknown user (e.g: `~unknown/...`)
func ReportError ¶
func ReportError(err error)
ReportError prints an error if it is not nil, but otherwise does nothing.
func TPUAutoInstall ¶
func TPUAutoInstall(goxlaInstallPath string, useCache bool, verbosity VerbosityLevel) error
TPUAutoInstall installs the TPU PJRT if it is available on the system. goxlaInstallPath is expected to be a "lib/go-xla" directory, under which the PJRT plugin is installed.
func TPUInstall ¶
func TPUInstall(plugin, version, installPath string, useCache bool, verbosity VerbosityLevel) error
TPUInstall installs the TPU PJRT from the "libtpu" PIP packages, using pypi.org distributed files.
Checks performed: - Version exists - Downloaded files sha256 match the ones on pypi.org
func TPUValidateVersion ¶
TPUValidateVersion checks whether the TPU version selected by "-version" exists.
Types ¶
type AutoInstaller ¶
type AutoInstaller func(installPath string, useCache bool, verbosity VerbosityLevel) error
AutoInstaller is a function that automatically installs the PJRT plugin for the current platform. It should be safe to call multiple times, and be a no-op if the plugin is already installed.
It is expected to only be called concurrently.
type PipDependency ¶
type PipDependency struct {
Package string
Minimum, LowerBound, Maximum, UpperBound, Exact string
Condition string
}
PipDependency represents a parsed dependency from a PIP package.
func (*PipDependency) IsValid ¶
func (dep *PipDependency) IsValid(version string) bool
IsValid checks if the given version satisfies the dependency constraints.
type PipPackageInfo ¶
type PipPackageInfo struct {
// Top-level object returned by the API
Info struct {
Name string `json:"name"`
Version string `json:"version"` // This is the LATEST version
Summary string `json:"summary"`
HomePage string `json:"home_page"`
Author string `json:"author"`
AuthorEmail string `json:"author_email"`
License string `json:"license"`
ProjectURL string `json:"project_url"`
RequiresPython string `json:"requires_python"`
// This is a list of dependencies/requirements
RequiresDist []string `json:"requires_dist"`
} `json:"info"`
// Releases is a map of all versions, where the key is the version string (e.g., "1.2.3")
Releases map[string][]PipReleaseInfo `json:"releases"`
}
PipPackageInfo is the JSON response from pypi.org for a given package.
func CudaGetPJRTPipInfo ¶
func CudaGetPJRTPipInfo(plugin string) (*PipPackageInfo, string, error)
CudaGetPJRTPipInfo returns the JSON info for the PIP package that corresponds to the plugin.
func GetPipInfo ¶
func GetPipInfo(packageName string) (*PipPackageInfo, error)
GetPipInfo retrieves package information from pypi.org for the given package name.
func TPUGetPJRTPipInfo ¶
func TPUGetPJRTPipInfo(plugin string) (*PipPackageInfo, string, error)
TPUGetPJRTPipInfo returns the JSON info for the PIP package that corresponds to the plugin.
func (*PipPackageInfo) ParseDependencies ¶
func (info *PipPackageInfo) ParseDependencies() ([]PipDependency, error)
ParseDependencies parses the RequiresDist field into structured PipDependency objects.
type PipReleaseInfo ¶
type PipReleaseInfo struct {
// You can add more fields here if you need file-specific details
PackageType string `json:"packagetype"`
Filename string `json:"filename"`
URL string `json:"url"`
Digests map[string]string `json:"digests"`
}
PipReleaseInfo is the JSON response from pypi.org for a given package version, for some platform.
func PipSelectRelease ¶
func PipSelectRelease(releaseInfos []PipReleaseInfo, platform *regexp.Regexp, anyMatchingVersion bool) (*PipReleaseInfo, error)
PipSelectRelease selects the release for the given platform (regexp).
If anyMatchingVersion is true, it will return the first release that matches the platform. Otherwise, it will return an error if there are multiple matches.
type Spinner ¶ added in v0.1.2
type Spinner struct {
// contains filtered or unexported fields
}
Spinner is a utility to run an action while displaying a rotating text indicator and allowing the action to update the title text.
func NewSpinner ¶ added in v0.1.2
func NewSpinner() *Spinner
NewSpinner creates a new Spinner instance.
func (*Spinner) Action ¶ added in v0.1.2
Action sets the function to be executed. The function receives a channel it can use to send real-time title updates.