Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

(Automatic) version bump #831

Merged
merged 9 commits into from
Feb 5, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/CI.yml
Original file line number Diff line number Diff line change
Expand Up @@ -199,7 +199,7 @@ jobs:
pip install .[pytorch_cpu]
- name: Run pytest tests
run: |
pytest -vx tests/version_test.py
pytest -vx tests/test_version.py
pytest -vx tests/test_num_params.py
pytest -vx tests/test_param_shapes.py
pytest -vx tests/test_param_types.py
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/linting.yml
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ jobs:
- name: Install yapf
run: |
python -m pip install --upgrade pip
pip install yapf==0.32
pip install yapf==0.32 toml
- name: Run yapf
run: |
yapf . --diff --recursive
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -23,4 +23,6 @@ wandb/
scoring/plots/

!scoring/test_data/experiment_dir/study_0/mnist_jax/trial_0/eval_measurements.csv
!scoring/test_data/experiment_dir/study_0/mnist_jax/trial_1/eval_measurements.csv
!scoring/test_data/experiment_dir/study_0/mnist_jax/trial_1/eval_measurements.csv

algorithmic_efficiency/_version.py
13 changes: 13 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
- [Style Testing](#style-testing)
- [Unit and Integration Tests](#unit-and-integration-tests)
- [Regression Tests](#regression-tests)
- [Versioning](#versioning)

## Contributing to MLCommons

Expand Down Expand Up @@ -276,3 +277,15 @@ To run a regression test:
2. Turn on the self-hosted runner.
3. Run the self-hosted runner application for the runner to accept jobs.
4. Open a pull request into mian to trigger the workflow.

### Versioning

The package version is automatically determined by the `setuptools_scm` package based on the last git tag.
It follows the structure `major.minor.patch` + `devN` where `N` is the number of commits since the last tag.
It automatically increments the patch version (i.e. it guesses the next version) if there are commits after the last tag.
Additionally, if there are uncommitted changes, the version will include a suffix separated by a `+` character and includes the last commit hash plus the date on dirt workdir (see [setuptools_scm's documentation](https://setuptools-scm.readthedocs.io/en/latest/extending/#setuptools_scmlocal_scheme) with the default version and local scheme).
You can check what version `setuptools_scm` is creating by running `python -m setuptools_scm`.

To create a new version, create a new release (and tag) in the GitHub UI.
The package version is automatically updated to the new version.
Once the package is installed, the version can be accessed as the package attribute `algorithmic_efficiency.__version__`, i.e. via `python -c "import algorithmic_efficiency; print(algorithmic_efficiency.__version__)"`.
4 changes: 3 additions & 1 deletion algorithmic_efficiency/__init__.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
"""Algorithmic Efficiency."""

__version__ = '0.1.0'
from ._version import version as __version__

__all__ = ["__version__"]
331 changes: 331 additions & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,331 @@
###############################################################################
# MLCommons Algorithmic Efficiency. #
###############################################################################

[project]
name = "algorithmic_efficiency"
dynamic = ["version"]
description = "Codebase for the AlgoPerf: Training Algorithms benchmark"
authors = [
{ name = "MLCommons Algorithms Working Group", email = "[email protected]" },
]
license = { text = "Apache 2.0" }
readme = "README.md"
requires-python = ">=3.8"
keywords = [
"algoperf",
"algorithmic-efficiency",
"machine-learning",
"deep-learning",
"optimization",
"benchmarking",
"training-methods",
]
classifiers = [
"Development Status :: 3 - Alpha",
"Intended Audience :: Developers",
"Intended Audience :: Science/Research",
"License :: OSI Approved :: Apache Software License",
"Operating System :: OS Independent",
"Programming Language :: Python :: 3.8",
"Programming Language :: Python :: 3.9",
"Programming Language :: Python :: 3.10",
"Topic :: Scientific/Engineering :: Artificial Intelligence",
]
dependencies = [
"absl-py==1.4.0",
"networkx==3.1",
"docker==7.0.0",
"numpy>=1.23",
"pandas>=2.0.1",
"tensorflow==2.12.0",
"tensorflow-datasets==4.9.2",
"tensorflow-probability==0.20.0",
"tensorflow-addons==0.20.0",
"gputil==1.4.0",
"psutil==5.9.5",
"clu==0.0.7",
"matplotlib>=3.7.2",
"tabulate==0.9.0",
]

[build-system]
requires = ["setuptools>=45", "setuptools_scm[toml]>=6.2"]
build-backend = "setuptools.build_meta"

[tool.setuptools]
py-modules = ["submission_runner"]
include-package-data = true
zip-safe = false

[tool.setuptools.packages]
find = {} # Scanning implicit namespaces is active by default

[tool.setuptools_scm]
version_file = "algorithmic_efficiency/_version.py"

###############################################################################
# (Optional) Dependencies #
###############################################################################
[project.optional-dependencies]
# All workloads
full = [
"algorithmic_efficiency[criteo1tb,fastmri,ogbg,librispeech_conformer,wmt]",
]
# All workloads plus development dependencies
full_dev = ["algorithmic_efficiency[full,dev]"]
# Dependencies for developing the package
dev = [
"isort==5.12.0",
"pylint==2.17.4",
"pytest==7.3.1",
"yapf==0.33.0",
"pre-commit==3.3.1",
]

# Workloads
criteo1tb = ["scikit-learn==1.2.2"]
fastmri = ["h5py==3.8.0", "scikit-image==0.20.0"]
ogbg = ["jraph==0.0.6.dev0", "scikit-learn==1.2.2"]
librispeech_conformer = [
"sentencepiece==0.1.99",
"tensorflow-text==2.12.1",
"pydub==0.25.1",
]
wmt = ["sentencepiece==0.1.99", "tensorflow-text==2.12.1", "sacrebleu==1.3.1"]

# Frameworks
jax_core_deps = [
"flax==0.6.10",
"optax==0.1.5",
# Todo(kasimbeg): verify if this is necessary after we upgrade jax.
"chex==0.1.7",
"ml_dtypes==0.2.0",
"protobuf==4.25.3",
]
jax_cpu = [
"jax==0.4.10",
"jaxlib==0.4.10",
"algorithmic_efficiency[jax_core_deps]",
]
jax_gpu = [
"jax==0.4.10",
"jaxlib==0.4.10+cuda12.cudnn88",
"algorithmic_efficiency[jax_core_deps]",
]
pytorch_cpu = ["torch==2.1.0", "torchvision==0.16.0"]
pytorch_gpu = [
"torch==2.1.0",
"torchvision==0.16.0",
] # Note: omit the cuda suffix and installing from the appropriate wheel will result in using locally installed CUDA.
wandb = ["wandb==0.16.5"]

###############################################################################
# Linting Configurations #
###############################################################################

# yapf configuration
[tool.yapf]
based_on_style = "yapf"
each_dict_entry_on_separate_line = false
split_all_top_level_comma_separated_values = true
[tool.yapfignore]
ignore_patterns = ["algorithmic_efficiency/_version.py"]

# isort configuration
[tool.isort]
profile = "google"

# pylint configuration
[tool.pylint.MASTER]
persistent = false
ignore = "get_references_web.py,get_references_web_single_group.py,_version.py"

[tool.pylint.REPORTS]
reports = false
msg-template = "{msg_id}:{line:3} {obj}: {msg} [{symbol}]"

[tool.pylint.MESSAGES_CONTROL]
enable = "indexing-exception,old-raise-syntax"

[tool.pylint.BASIC]
# Required attributes for module, separated by a comma
#required-attributes=
# Regular expression which should only match the name
# of functions or classes which do not require a docstring.
no-docstring-rgx = "(__.*__|main)"
# Min length in lines of a function that requires a docstring.
docstring-min-length = 10
# Regular expression which should only match correct module names. The
# leading underscore is sanctioned for private modules by Google's style
# guide.
#
# There are exceptions to the basic rule (_?[a-z][a-z0-9_]*) to cover
# requirements of Python's module system.
module-rgx = "^(_?[a-z][a-z0-9_]*)|__init__$"
# Regular expression which should only match correct module level names
const-rgx = "^(_?[A-Z][A-Z0-9_]*|__[a-z0-9_]+__|_?[a-z][a-z0-9_]*)$"
# Regular expression which should only match correct class attribute
class-attribute-rgx = "^(_?[A-Z][A-Z0-9_]*|__[a-z0-9_]+__|_?[a-z][a-z0-9_]*)$"
# Regular expression which should only match correct class names
class-rgx = "^_?[A-Z][a-zA-Z0-9]*$"
# Regular expression which should only match correct function names.
# 'camel_case' and 'snake_case' group names are used for consistency of naming
# styles across functions and methods.
function-rgx = "^(?:(?P<exempt>setUp|tearDown|setUpModule|tearDownModule)|(?P<camel_case>_?[A-Z][a-zA-Z0-9]*)|(?P<snake_case>_?[a-z][a-z0-9_]*))$"
# Regular expression which should only match correct method names.
# 'camel_case' and 'snake_case' group names are used for consistency of naming
# styles across functions and methods. 'exempt' indicates a name which is
# consistent with all naming styles.
method-rgx = "(?x)^(?:(?P<exempt>_[a-z0-9_]+__|runTest|setUp|tearDown|setUpTestCase|tearDownTestCase|setupSelf|tearDownClass|_testDatasetSize|setUpClass|test|assert)_*[A-Z0-9][a-zA-Z0-9_]*|(?:test|assert)_*[A-Z0-9][a-zA-Z0-9_]*|next|(?P<camel_case>_{0,2}[A-Z][a-zA-Z0-9_]*)|(?P<snake_case>_{0,2}[a-z][a-z0-9_]*))$"
# Regular expression which should only match correct instance attribute names
attr-rgx = "^_{0,2}[a-z][a-z0-9_]*$"
# Regular expression which should only match correct argument names
argument-rgx = "^[a-z][a-z0-9_]*$"
# Regular expression which should only match correct variable names
variable-rgx = "^[a-z][a-z0-9_]*$"
# Regular expression which should only match correct list comprehension /
# generator expression variable names
inlinevar-rgx = "^[a-z][a-z0-9_]*$"
# Good variable names which should always be accepted, separated by a comma
good-names = "main,_"
# Bad variable names which should always be refused, separated by a comma
bad-names = ""
# List of builtins function names that should not be used, separated by a comma
#bad-functions=input,apply,reduce
# List of decorators that define properties, such as abc.abstractproperty.
property-classes = "abc.abstractproperty"

[tool.pylint.typecheck]
# Tells whether missing members accessed in mixin class should be ignored. A
# mixin class is detected if its name ends with "mixin" (case insensitive).
ignore-mixin-members = true

# List of decorators that create context managers from functions, such as
# contextlib.contextmanager.
contextmanager-decorators = [
"contextlib.contextmanager",
"contextlib2.contextmanager",
]

[tool.pylint.VARIABLES]
# Tells whether we should check for unused import in __init__ files.
init-import = false

# A regular expression matching names used for dummy variables (i.e. not used).
dummy-variables-rgx = "^\\*{0,2}(_$|unused_|dummy_)"

# List of additional names supposed to be defined in builtins.
additional-builtins = []

[tool.pylint.CLASSES]
# List of method names used to declare (i.e. assign) instance attributes.
defining-attr-methods = ["__init__", "__new__", "setUp"]

# Valid names for the first argument to a class method.
valid-classmethod-first-arg = ["cls", "class_"]

[tool.pylint.EXCEPTIONS]
overgeneral-exceptions = [
"builtins.StandardError",
"builtins.Exception",
"builtins.BaseException",
]

[tool.pylint.IMPORTS]
# Deprecated modules which should not be used, separated by a comma
deprecated-modules = ["regsub", "TERMIOS", "Bastion", "rexec", "sets"]

[tool.pylint.FORMAT]
# List of checkers and warnings to disable.
disable = [
"abstract-method",
"access-member-before-definition",
"arguments-differ",
"assignment-from-no-return",
"attribute-defined-outside-init",
"bad-mcs-classmethod-argument",
"bad-option-value",
"c-extension-no-member",
"consider-merging-isinstance",
"consider-using-dict-comprehension",
"consider-using-enumerate",
"consider-using-in",
"consider-using-set-comprehension",
"consider-using-ternary",
"deprecated-method",
"design",
"file-ignored",
"fixme",
"global-statement",
"import-error",
"inconsistent-return-statements",
"invalid-unary-operand-type",
"len-as-condition",
"locally-disabled",
"locally-enabled",
"misplaced-comparison-constant",
"missing-docstring",
"multiple-imports",
"no-else-return",
"no-member",
"no-name-in-module",
"no-self-use",
"no-value-for-parameter",
"not-an-iterable",
"not-context-manager",
"pointless-except",
"protected-access",
"redefined-argument-from-local",
"signature-differs",
"similarities",
"simplifiable-if-expression",
"star-args",
"super-init-not-called",
"suppressed-message",
"too-many-function-args",
"trailing-comma-tuple",
"trailing-newlines",
"ungrouped-imports",
"unnecessary-pass",
"unsubscriptable-object",
"unused-argument",
"useless-object-inheritance",
"useless-return",
"useless-suppression",
"wrong-import-order",
"wrong-import-position",
"unneeded-not",
"unexpected-keyword-arg",
"redundant-keyword-arg",
"unspecified-encoding",
"logging-fstring-interpolation",
"consider-using-f-string",
"use-dict-literal",
]
# Maximum number of characters on a single line.
max-line-length = 80
ignore-long-lines = "(?x)(^\\s*(import|from)\\s|^\\s*(\\#\\ )?<?(https?|ftp):\\/\\/[^\\s\\/$.?#].[^\\s]*>?$|^[a-zA-Z_][a-zA-Z0-9_]*\\s*=\\s*('[^']\\S+'|\"[^\"]\\S+\"))"
# Maximum number of lines in a module
max-module-lines = 99999
# String used as indentation unit. We differ from PEP8's normal 4 spaces.
indent-string = ' '
single-line-if-stmt = true
# Do not warn about multiple statements on a single line for constructs like
# if test: stmt
[tool.pylint.LOGGING]
logging-modules = "logging,absl.logging"
# Add logging modules.
[tool.pylint.MISCELLANEOUS]
# Maximum line length for lambdas
#short-func-length=1
# List of module members that should be marked as deprecated.
# All of the string functions are listed in 4.1.4 Deprecated string functions
# in the Python 2.4 docs.
#deprecated-members=string.atof,string.atoi,string.atol,string.capitalize,string.expandtabs,string.find,string.rfind,string.index,string.rindex,string.count,string.lower,string.split,string.rsplit,string.splitfields,string.join,string.joinfields,string.lstrip,string.rstrip,string.strip,string.swapcase,string.translate,string.upper,string.ljust,string.rjust,string.center,string.zfill,string.replace,sys.exitfunc,sys.maxint
# List of exceptions that do not need to be mentioned in the Raises section of
# a docstring.
#ignore-exceptions=AssertionError,NotImplementedError,StopIteration,TypeError
# Number of spaces of indent required when the last token on the preceding line
# is an open (, [, or {.
indent-after-paren = 4
Loading
Loading