CompilerGym v0.1.8
This release introduces some significant changes to the way that benchmarks are managed, introducing a new dataset API. This enabled us to add support for millions of new benchmarks and a more efficient implementation for the LLVM environment, but this will require some migrating of old code to the new interfaces (see "Migration Checklist" below).
Highlights
Some of the key changes of this release are:
- [Core API change] We have added a Python
Benchmark
class (#190). Theenv.benchmark
attribute is now an instance of this class rather than a string (#222). - [Core behavior change] Environments will no longer select benchmarks randomly. Now
env.reset()
will now always select the last-used benchmark, unless thebenchmark
argument is provided orenv.benchmark
has been set. If no benchmark is specified, a default is used. - [API deprecations] We have added a new
Dataset
class hierarchy (#191, #192). All datasets are now available without needing to be downloaded first, and a newDatasets
class can be used to iterate over them (#200). We have deprecated the old dataset management operations, thecompiler_gym.bin.datasets
script, and removed the--dataset
and--ls_benchmark
flags from the command line tools. - [RPC interface change] The
StartSession
RPC endpoint now accepts a list of initial observations to compute. This removes the need for an immediate call toStep
, reducing environment reset time by 15-21% (#189). - [LLVM] We have added several new datasets of benchmarks, including the Csmith and llvm-stress program generators (#207), a dataset of OpenCL kernels (#208), and a dataset of compilable C functions (#210). See the docs for an overview.
CompilerEnv
now takes an optionalLogger
instance at construction time for fine-grained control over logging output (#187).- [LLVM] The ModuleID and source_filename of LLVM-IR modules are now anonymized to prevent unintentional overfitting to benchmarks by name (#171).
- [docs] We have added a Feature Stability section to the documentation (#196).
- Numerous bug fixes and improvements.
Migration Checklist
Please use this checklist when updating code for the previous CompilerGym release:
- Review code that accesses the
env.benchmark
property and update toenv.benchmark.uri
if a string name is required. Setting this attribute by string (env.benchmark = "benchmark://a-v0/b"
) and comparison to string types (env.benchmark == "benchmark://a-v0/b"
) still work. - Review code that calls
env.reset()
without first setting a benchmark. Previously, callingenv.reset()
would select a random benchmark. Now,env.reset()
always selects the last used benchmark, or a predetermined default if none is specified. - Review code that relies on
env.benchmark
beingNone
to select benchmarks randomly. Now,env.benchmark
is always set to the previously used benchmark, or a predetermined default benchmark if none has been specified. Settingenv.benchmark = None
will raise an error. Select a benchmark randomly by sampling from theenv.datasets.benchmark_uris()
iterator. - Remove calls to
env.require_dataset()
and related operations. These are no longer required. - Remove accesses to
env.benchmarks
. An iterator over available benchmark URIs is now available atenv.datasets.benchmark_uris()
, but the list of URIs cannot be relied on to be fully enumerable (the LLVM environments have over 2^32 URIs). - Review code that accesses
env.observation_space
and update toenv.observation_space_spec
where necessary (#228). - Update compiler service implementations to support the updated RPC interface by removing the deprecated
GetBenchmarks
RPC endpoint and replacing it withDataset
classes. See the example service for details. - [LLVM] Update references to the
poj104-v0
dataset topoj104-v1
. - [LLVM] Update references to the
cBench-v1
dataset tocbench-v1
.