Skip to content
This repository has been archived by the owner on May 21, 2022. It is now read-only.

Performance issues #9

Open
karajan9 opened this issue Feb 11, 2018 · 5 comments
Open

Performance issues #9

karajan9 opened this issue Feb 11, 2018 · 5 comments

Comments

@karajan9
Copy link

I recently became interested in reinforcement learning, so I tried my luck with these environments by OpenAI. I noticed, however, quite a huge drop in performance in comparison to a Python version. On my computer 1000 runs of a random cartpole took about 16s in Julia, Python took about 4.8s for 10000 runs, which makes a factor of about 30x. With this kind of a difference it's woefully difficult to rely on Julia for these kind of simulations.

I am not very experienced in Julia; I know that calling Python from Julia isn't the fastest thing around, but are those factors usual or might I have a different problem going on?

If you need any more information or data, I'll happily provide both.

@JobJob
Copy link
Member

JobJob commented Feb 14, 2018

Interesting. Can you post a gist of your code (in python and julia)?

@karajan9
Copy link
Author

Thanks for coming back to me so quickly! Here is my (stripped down) Julia code:

using OpenAIGym

env = GymEnv("CartPole-v0")

function gen_data(N::Int)
    for i in 1:N
        reset!(env)
        for sars in Episode(env, RandomPolicy())
            state, action, reward, _ = sars
        end
    end
end

@time gen_data(1000)

This gave me the output for N = 1000:
15.943330 seconds (4.18 M allocations: 159.613 MiB, 0.50% gc time)
The code is adapted from https://github.com/CarloLucibello/DeepRLexamples.jl/blob/master/examples/reinforce_cartpole.jl

import gym

env = gym.make("CartPole-v0")

def gen_data(N):
    for i in range(N):
        env.reset()
        while True:
            action = env.action_space.sample()
            state, reward, done, info = env.step(action)
            if done == True:
                break

%time gen_data(10000)

Output for N = 10000:
CPU times: user 3.93 s, sys: 0 ns, total: 3.93 s
I modeled this code to be mostly the same as the Julia code.

I profiled the Julia code an most of the time it seemed to be spending in
PyCall/src/conversions.jl:808
but that doesn't mean too much to me, beyond what it says on the front. Maybe an issue with Python returning Lists instead of numpy Arrays (which I guess would make it faster)?

@JobJob
Copy link
Member

JobJob commented Feb 19, 2018

Thanks for the minimal examples. I'd also noticed performance problems before but wasn't certain they were in this repo's code or in my code that was using it. Didn't get a chance to look into it at the time.

Anyway, did a little digging, think I've tracked down most of the issues. With some patches to this repo and PyCall, I have CartPole-v0 within 2x, and Pong-v4 running within 1.25x of the python speed.

Will probably only get around to making PRs to the respective repos next week though.

Cheers.

@JobJob
Copy link
Member

JobJob commented Sep 13, 2018

I now have gym running as fast in Julia as in Python. PRs forthcoming here once JuliaPy/PyCall.jl#487 and a version of JuliaPy/PyCall.jl#486 get merged.

@JobJob
Copy link
Member

JobJob commented Sep 15, 2018

@karajan9 see #13

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants