mirror of
https://github.com/huggingface/kernels.git
synced 2025-10-20 21:10:02 +08:00
Compare commits
5 Commits
release-0.
...
v0.10.4
Author | SHA1 | Date | |
---|---|---|---|
d8fefaeef5 | |||
ed048616fe | |||
b182cd3458 | |||
ce77658efc | |||
b96b154e7f |
@ -39,3 +39,13 @@ The approach of `forward`-replacement is the least invasive, because
|
||||
it preserves the original model graph. It is also reversible, since
|
||||
even though the `forward` of a layer _instance_ might be replaced,
|
||||
the corresponding class still has the original `forward`.
|
||||
|
||||
## Misc
|
||||
|
||||
### How can I disable kernel reporting in the user-agent?
|
||||
|
||||
By default, we collect telemetry when a call to `get_kernel()` is made.
|
||||
This only includes the `kernels` version, `torch` version, and the build
|
||||
information for the kernel being requested.
|
||||
|
||||
You can disable this by setting `export DISABLE_TELEMETRY=yes`.
|
||||
|
@ -1,6 +1,6 @@
|
||||
[project]
|
||||
name = "kernels"
|
||||
version = "0.10.3.dev0"
|
||||
version = "0.10.4"
|
||||
description = "Download compute kernels"
|
||||
authors = [
|
||||
{ name = "OlivierDehaene", email = "olivier@huggingface.co" },
|
||||
|
@ -4,7 +4,7 @@ import json
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
from huggingface_hub import create_repo, upload_folder
|
||||
from huggingface_hub import create_repo, upload_folder, create_branch
|
||||
|
||||
from kernels.compat import tomllib
|
||||
from kernels.lockfile import KernelLock, get_kernel_locks
|
||||
@ -204,6 +204,7 @@ def lock_kernels(args):
|
||||
|
||||
|
||||
def upload_kernels(args):
|
||||
# Resolve `kernel_dir` to be uploaded.
|
||||
kernel_dir = Path(args.kernel_dir).resolve()
|
||||
build_dir = kernel_dir / "build"
|
||||
if not kernel_dir.is_dir():
|
||||
@ -215,6 +216,9 @@ def upload_kernels(args):
|
||||
repo_id=args.repo_id, private=args.private, exist_ok=True
|
||||
).repo_id
|
||||
|
||||
if args.branch is not None:
|
||||
create_branch(repo_id=repo_id, branch=args.branch, exist_ok=True)
|
||||
|
||||
delete_patterns: set[str] = set()
|
||||
for build_variant in build_dir.iterdir():
|
||||
if build_variant.is_dir():
|
||||
|
@ -11,7 +11,7 @@ import sys
|
||||
from importlib.metadata import Distribution
|
||||
from pathlib import Path
|
||||
from types import ModuleType
|
||||
from typing import Dict, List, Optional, Tuple
|
||||
from typing import Dict, List, Optional, Tuple, Union
|
||||
|
||||
from huggingface_hub import file_exists, snapshot_download
|
||||
from packaging.version import parse
|
||||
@ -19,6 +19,8 @@ from packaging.version import parse
|
||||
from kernels._versions import select_revision_or_version
|
||||
from kernels.lockfile import KernelLock, VariantLock
|
||||
|
||||
ENV_VARS_TRUE_VALUES = {"1", "ON", "YES", "TRUE"}
|
||||
|
||||
|
||||
def _get_cache_dir() -> Optional[str]:
|
||||
"""Returns the kernels cache directory."""
|
||||
@ -54,7 +56,7 @@ def build_variant() -> str:
|
||||
compute_framework = f"rocm{rocm_version.major}{rocm_version.minor}"
|
||||
elif torch.backends.mps.is_available():
|
||||
compute_framework = "metal"
|
||||
elif torch.version.xpu is not None:
|
||||
elif hasattr(torch.version, "xpu") and torch.version.xpu is not None:
|
||||
version = torch.version.xpu
|
||||
compute_framework = f"xpu{version[0:4]}{version[5:6]}"
|
||||
elif _get_privateuse_backend_name() == "npu":
|
||||
@ -108,6 +110,7 @@ def install_kernel(
|
||||
revision: str,
|
||||
local_files_only: bool = False,
|
||||
variant_locks: Optional[Dict[str, VariantLock]] = None,
|
||||
user_agent: Optional[Union[str, dict]] = None,
|
||||
) -> Tuple[str, Path]:
|
||||
"""
|
||||
Download a kernel for the current environment to the cache.
|
||||
@ -123,6 +126,8 @@ def install_kernel(
|
||||
Whether to only use local files and not download from the Hub.
|
||||
variant_locks (`Dict[str, VariantLock]`, *optional*):
|
||||
Optional dictionary of variant locks for validation.
|
||||
user_agent (`Union[str, dict]`, *optional*):
|
||||
The `user_agent` info to pass to `snapshot_download()` for internal telemetry.
|
||||
|
||||
Returns:
|
||||
`Tuple[str, Path]`: A tuple containing the package name and the path to the variant directory.
|
||||
@ -130,6 +135,7 @@ def install_kernel(
|
||||
package_name = package_name_from_repo_id(repo_id)
|
||||
variant = build_variant()
|
||||
universal_variant = universal_build_variant()
|
||||
user_agent = _get_user_agent(user_agent=user_agent)
|
||||
repo_path = Path(
|
||||
snapshot_download(
|
||||
repo_id,
|
||||
@ -137,6 +143,7 @@ def install_kernel(
|
||||
cache_dir=CACHE_DIR,
|
||||
revision=revision,
|
||||
local_files_only=local_files_only,
|
||||
user_agent=user_agent,
|
||||
)
|
||||
)
|
||||
|
||||
@ -213,7 +220,10 @@ def install_kernel_all_variants(
|
||||
|
||||
|
||||
def get_kernel(
|
||||
repo_id: str, revision: Optional[str] = None, version: Optional[str] = None
|
||||
repo_id: str,
|
||||
revision: Optional[str] = None,
|
||||
version: Optional[str] = None,
|
||||
user_agent: Optional[Union[str, dict]] = None,
|
||||
) -> ModuleType:
|
||||
"""
|
||||
Load a kernel from the kernel hub.
|
||||
@ -229,6 +239,8 @@ def get_kernel(
|
||||
version (`str`, *optional*):
|
||||
The kernel version to download. This can be a Python version specifier, such as `">=1.0.0,<2.0.0"`.
|
||||
Cannot be used together with `revision`.
|
||||
user_agent (`Union[str, dict]`, *optional*):
|
||||
The `user_agent` info to pass to `snapshot_download()` for internal telemetry.
|
||||
|
||||
Returns:
|
||||
`ModuleType`: The imported kernel module.
|
||||
@ -245,7 +257,9 @@ def get_kernel(
|
||||
```
|
||||
"""
|
||||
revision = select_revision_or_version(repo_id, revision, version)
|
||||
package_name, package_path = install_kernel(repo_id, revision=revision)
|
||||
package_name, package_path = install_kernel(
|
||||
repo_id, revision=revision, user_agent=user_agent
|
||||
)
|
||||
return import_from_path(package_name, package_path / package_name / "__init__.py")
|
||||
|
||||
|
||||
@ -501,3 +515,24 @@ def git_hash_object(data: bytes, object_type: str = "blob"):
|
||||
|
||||
def package_name_from_repo_id(repo_id: str) -> str:
|
||||
return repo_id.split("/")[-1].replace("-", "_")
|
||||
|
||||
|
||||
def _get_user_agent(
|
||||
user_agent: Optional[Union[dict, str]] = None,
|
||||
) -> Union[None, dict, str]:
|
||||
import torch
|
||||
|
||||
from . import __version__
|
||||
|
||||
if os.getenv("DISABLE_TELEMETRY", "false").upper() in ENV_VARS_TRUE_VALUES:
|
||||
return None
|
||||
|
||||
if user_agent is None:
|
||||
user_agent = {
|
||||
"kernels": __version__,
|
||||
"torch": torch.__version__,
|
||||
"build_variant": build_variant(),
|
||||
"file_type": "kernel",
|
||||
}
|
||||
|
||||
return user_agent
|
||||
|
@ -7,7 +7,7 @@ from pathlib import Path
|
||||
from typing import List
|
||||
|
||||
import pytest
|
||||
from huggingface_hub import delete_repo, model_info
|
||||
from huggingface_hub import delete_repo, model_info, list_repo_refs
|
||||
|
||||
from kernels.cli import upload_kernels
|
||||
|
||||
@ -83,6 +83,11 @@ def test_kernel_upload_works_as_expected(branch):
|
||||
|
||||
repo_filenames = get_filenames_from_a_repo(REPO_ID)
|
||||
assert any(str(script_path.name) for f in repo_filenames)
|
||||
|
||||
if branch is not None:
|
||||
refs = list_repo_refs(repo_id=REPO_ID)
|
||||
assert any(ref_branch.name == branch for ref_branch in refs.branches)
|
||||
|
||||
delete_repo(repo_id=REPO_ID)
|
||||
|
||||
|
||||
@ -95,7 +100,7 @@ def test_kernel_upload_deletes_as_expected():
|
||||
build_dir.mkdir(parents=True, exist_ok=True)
|
||||
script_path = build_dir / "foo_2025.py"
|
||||
script_path.write_text(PY_CONTENT)
|
||||
upload_kernels(UploadArgs(tmpdir, REPO_ID, False))
|
||||
upload_kernels(UploadArgs(tmpdir, REPO_ID, False, None))
|
||||
|
||||
repo_filenames = get_filenames_from_a_repo(REPO_ID)
|
||||
filename_to_change = get_filename_to_change(repo_filenames)
|
||||
@ -107,7 +112,7 @@ def test_kernel_upload_deletes_as_expected():
|
||||
changed_filename = next_filename(Path(filename_to_change))
|
||||
script_path = build_dir / changed_filename
|
||||
script_path.write_text(PY_CONTENT)
|
||||
upload_kernels(UploadArgs(tmpdir, REPO_ID, False))
|
||||
upload_kernels(UploadArgs(tmpdir, REPO_ID, False, None))
|
||||
|
||||
repo_filenames = get_filenames_from_a_repo(REPO_ID)
|
||||
assert any(str(changed_filename) in k for k in repo_filenames), f"{repo_filenames=}"
|
||||
|
Reference in New Issue
Block a user