Status: Manutenção (espera correções de bugs e pequenas atualizações)
OpenAI Baselines é um conjunto de implementações de alta qualidade de algoritmos de aprendizagem por reforço.
Esses algoritmos tornarão mais fácil para a comunidade de pesquisa replicar, refinar e identificar novas ideias e criarão boas linhas de base para a construção de pesquisas. Nossa implementação do DQN e suas variantes estão aproximadamente no mesmo nível das pontuações dos artigos publicados. Esperamos que sejam usados como uma base em torno da qual novas ideias possam ser adicionadas e como uma ferramenta para comparar uma nova abordagem com as existentes.
As linhas de base requerem python3 (>=3.5) com os cabeçalhos de desenvolvimento. Você também precisará dos pacotes de sistema CMake, OpenMPI e zlib. Eles podem ser instalados da seguinte forma
sudo apt-get update && sudo apt-get install cmake libopenmpi-dev python3-dev zlib1g-dev
A instalação de pacotes de sistema no Mac requer Homebrew. Com o Homebrew instalado, execute o seguinte:
brew install cmake openmpi
Do ponto de vista geral da sanidade do pacote python, é uma boa ideia usar ambientes virtuais (virtualenvs) para garantir que pacotes de projetos diferentes não interfiram uns com os outros. Você pode instalar o virtualenv (que é um pacote pip) via
pip install virtualenv
Virtualenvs são essencialmente pastas que possuem cópias do executável python e de todos os pacotes python. Para criar um virtualenv chamado venv com python3, executa-se
virtualenv /path/to/venv --python=python3
Para ativar um virtualenv:
. /path/to/venv/bin/activate
Tutorial mais completo sobre virtualenvs e opções pode ser encontrado aqui
A ramificação master oferece suporte ao Tensorflow da versão 1.4 a 1.14. Para suporte ao Tensorflow 2.0, use o branch tf2.
Clone o repositório e faça cd nele:
git clone https://github.com/openai/baselines.git
cd baselines
Se você ainda não tiver o TensorFlow instalado, instale sua versão favorita do TensorFlow. Na maioria dos casos, você pode usar
pip install tensorflow-gpu==1.14 # if you have a CUDA-compatible gpu and proper drivers
ou
pip install tensorflow==1.14
para instalar o Tensorflow 1.14, que é a versão mais recente do Tensorflow compatível com o branch master. Consulte o guia de instalação do TensorFlow para obter mais detalhes.
Instalar pacote de linhas de base
pip install -e .
Alguns dos exemplos de linhas de base usam o simulador de física MuJoCo (dinâmica multiarticular em contato), que é proprietário e requer binários e uma licença (uma licença temporária de 30 dias pode ser obtida em www.mujoco.org). Instruções sobre como configurar o MuJoCo podem ser encontradas aqui
Todos os testes de unidade em linhas de base podem ser executados usando o pytest runner:
pip install pytest
pytest
A maioria dos algoritmos no repositório de linhas de base são usados da seguinte forma:
python -m baselines.run --alg= < name of the algorithm > --env= < environment_id > [additional arguments]
Por exemplo, para treinar uma rede totalmente conectada controlando humanóide MuJoCo usando PPO2 para intervalos de tempo de 20 milhões
python -m baselines.run --alg=ppo2 --env=Humanoid-v2 --network=mlp --num_timesteps=2e7
Observe que para ambientes mujoco a rede totalmente conectada é o padrão, então podemos omitir --network=mlp
Os hiperparâmetros para a rede e o algoritmo de aprendizagem podem ser controlados através da linha de comando, por exemplo:
python -m baselines.run --alg=ppo2 --env=Humanoid-v2 --network=mlp --num_timesteps=2e7 --ent_coef=0.1 --num_hidden=32 --num_layers=3 --value_network=copy
definirá o coeficiente de entropia para 0,1 e construirá uma rede totalmente conectada com 3 camadas com 32 unidades ocultas em cada uma e criará uma rede separada para estimativa da função de valor (de modo que seus parâmetros não sejam compartilhados com a rede de política, mas a estrutura seja a mesma )
Consulte docstrings em common/models.py para obter a descrição dos parâmetros de rede para cada tipo de modelo, e docstring para baselines/ppo2/ppo2.py/learn() para obter a descrição dos hiperparâmetros ppo2.
DQN com Atari é neste momento um clássico dos benchmarks. Para executar a implementação básica do DQN no Atari Pong:
python -m baselines.run --alg=deepq --env=PongNoFrameskip-v4 --num_timesteps=1e6
A API de serialização de algoritmos ainda não está devidamente unificada; no entanto, existe um método simples para salvar/restaurar modelos treinados. A opção de linha de comando --save_path
e --load_path
carrega o estado do tensorflow de um determinado caminho antes do treinamento e o salva após o treinamento, respectivamente. Vamos imaginar que você gostaria de treinar o ppo2 no Atari Pong, salvar o modelo e depois visualizar o que ele aprendeu.
python -m baselines.run --alg=ppo2 --env=PongNoFrameskip-v4 --num_timesteps=2e7 --save_path= ~ /models/pong_20M_ppo2
Isso deve chegar à recompensa média por episódio em torno de 20. Para carregar e visualizar o modelo, faremos o seguinte - carregar o modelo, treiná-lo para 0 etapas e, em seguida, visualizar:
python -m baselines.run --alg=ppo2 --env=PongNoFrameskip-v4 --num_timesteps=0 --load_path= ~ /models/pong_20M_ppo2 --play
NOTA: Os ambientes Mujoco requerem normalização para funcionar corretamente, por isso os envolvemos com o wrapper VecNormalize. Atualmente, para garantir que os modelos sejam salvos com normalização (para que os modelos treinados possam ser restaurados e executados sem treinamento adicional), os coeficientes de normalização são salvos como variáveis de tensorflow. Isso pode diminuir um pouco o desempenho, portanto, se você precisar de etapas de alto rendimento com o Mujoco e não precisar salvar/restaurar os modelos, pode fazer sentido usar a normalização numpy. Para fazer isso, defina 'use_tf=False` em linhas de base/run.py.
Por padrão, todos os dados de resumo, incluindo progresso e saída padrão, são salvos em um diretório exclusivo em uma pasta temporária, especificada por uma chamada para tempfile.gettempdir() do Python. O diretório pode ser alterado com a opção de linha de comando --log_path
.
python -m baselines.run --alg=ppo2 --env=PongNoFrameskip-v4 --num_timesteps=2e7 --save_path= ~ /models/pong_20M_ppo2 --log_path= ~ /logs/Pong/
NOTA: Esteja ciente de que o logger irá sobrescrever arquivos com o mesmo nome em um diretório existente, portanto, é recomendado que os nomes das pastas recebam um carimbo de data/hora exclusivo para evitar logs sobrescritos.
Outra maneira de alterar o diretório temporário é através do uso da variável de ambiente $OPENAI_LOGDIR
.
Para exemplos sobre como carregar e exibir os dados de treinamento, veja aqui.
Os resultados dos benchmarks no Mujoco (1M timesteps) e Atari (10M timesteps) estão disponíveis aqui para Mujoco e aqui para Atari respectivamente. Observe que esses resultados podem não estar na versão mais recente do código; o hash de commit específico com o qual os resultados foram obtidos é especificado na página de benchmarks.
Para citar este repositório em publicações:
@misc{baselines,
author = {Dhariwal, Prafulla and Hesse, Christopher and Klimov, Oleg and Nichol, Alex and Plappert, Matthias and Radford, Alec and Schulman, John and Sidor, Szymon and Wu, Yuhuai and Zhokhov, Peter},
title = {OpenAI Baselines},
year = {2017},
publisher = {GitHub},
journal = {GitHub repository},
howpublished = {url{https://github.com/openai/baselines}},
}