Adding Custom Domains¶
This tutorial will demonstrate how to add additional domains to A2Perf.
Path to A2Perf Domains¶
Domains are stored in A2Perf/a2perf/domains
. Currently, you’ll find the main
domains in this folder such as circuit_training
, quadruped_locomotion
, and
web_navigation
. There are also additional modules such as tfa
that is there
for interfacing with Tensorflow Agents.
Creating a new domain¶
To add a new domain:
Create a new folder in the domains directory. For the purposes of this tutorial, we will create a new domain called “my_domain”:
cd A2Perf/a2perf/domains
mkdir my_domain
Inside of
my_domain
, create the following files:
__init__.py
[any other files needed for your domain]
Inside of
__init__.py
, you will need to register your domain with gymnasium. Here is an example of how we do this for the web navigation domain:
import gymnasium as gym
import pkg_resources
base_url_path = pkg_resources.resource_filename('a2perf.domains.web_navigation',
'gwob')
base_url = f'file://{base_url_path}/'
data_dir = pkg_resources.resource_filename(
'a2perf.domains.web_navigation.environment_generation', 'data')
gym.envs.register(
id='WebNavigation-v0',
entry_point=(
'a2perf.domains.web_navigation.gwob.CoDE.environment:WebNavigationEnv'
),
apply_api_compatibility=False,
disable_env_checker=False,
kwargs=dict(
use_legacy_step=False,
use_legacy_reset=False,
data_dir=data_dir,
base_url=base_url),
)
Note: The base_url_path
, base_url
, and data_dir
are specific to web
navigation and are not necessary for your domain.
Additional configurations¶
When adding a new domain, you may need to configure additional settings:
Docker configurations: In
a2perf/launch/docker_utils.py
, add entries for your new domain:a. In the
get_docker_instructions
function:docker_instructions = { # ... existing entries ... BenchmarkDomain.MY_DOMAIN.value: common_setup + [ # Add your domain-specific Docker instructions here # E.g., installing dependencies, setting up the environment ], }
b. In the
get_entrypoint
function:entrypoints = { # ... existing entries ... BenchmarkDomain.MY_DOMAIN.value: xm.CommandList([ # Add your domain-specific entrypoint commands here ]), }
Update constants: In
a2perf/constants.py
, add your new domain to theBenchmarkDomain
enum and update theENV_NAMES
dictionary:import enum import gin @gin.constants_from_enum class BenchmarkDomain(enum.Enum): QUADRUPED_LOCOMOTION = "QuadrupedLocomotion" WEB_NAVIGATION = "WebNavigation" CIRCUIT_TRAINING = "CircuitTraining" MY_DOMAIN = "MyDomain" # Add your new domain here # ... (other existing code) ENV_NAMES = { # ... (existing domains) BenchmarkDomain.MY_DOMAIN: [ "MyDomain-Task1-v0", "MyDomain-Task2-v0", # Add all the environment names for your new domain ], }