0

I am using reinforcement learning in combination with a neural network (DQN). I have a MacBook with a 6 core i7 and an AMD GPU. TensorFlow doesn't see the GPU so it uses the CPU automatically. When I run the script I see in activity monitor that the CPU utilization goes from about 33% to ~50% i.e. not utilizing all CPU cores. My TensorFlow version is 2.2.0. I've tried:

with tf.device("/cpu:0"):

I also wanted to try:

sess = tf.Session(config=tf.ConfigProto(intra_op_parallelism_threads=NUM_THREADS))

But I don't understand how to use "sess" to train models.

It takes around 64 seconds for the script to run per episode. My question: How can make sure that my python script utilize all CPU cores, so it takes less time to train my model.

Function that makes model:

def OurModel(input_shape, action_space):
    X_input = Input(input_shape)

    # 'Dense' is the basic form of a neural network layer
    # Input Layer of state size(4) and Hidden Layer with 512 nodes
    X = Dense(512, input_shape=input_shape, activation="relu", kernel_initializer='he_uniform')(X_input)

            # Hidden layer with 256 nodes
    X = Dense(256, activation="relu", kernel_initializer='he_uniform')(X)

            # Hidden layer with 64 nodes
    X = Dense(64, activation="relu", kernel_initializer='he_uniform')(X)

            # Output Layer with # of actions: 2 nodes (left, right)
    X = Dense(action_space, activation="linear", kernel_initializer='he_uniform')(X)

    model = Model(inputs = X_input, outputs = X, name='CartPole DQN model')
    model.compile(loss="mse", optimizer=RMSprop(lr=0.00025, rho=0.95, epsilon=0.01), metrics=["accuracy"])

Functions that contain model.fit and model.predict

def act(self, state):
        if np.random.random() <= self.epsilon:
            return random.randrange(self.action_size)
        else:
            return np.argmax(self.model.predict(state))

and

def replay(self):
        if len(self.memory) < self.train_start:
            return
        # Randomly sample minibatch from the memory
        minibatch = random.sample(self.memory, min(len(self.memory), self.batch_size))

        state = np.zeros((self.batch_size, self.state_size))
        next_state = np.zeros((self.batch_size, self.state_size))
        action, reward, done = [], [], []

        # do this before prediction
        # for speedup, this could be done on the tensor level
        # but easier to understand using a loop
        for i in range(self.batch_size):
            state[i] = minibatch[i][0]
            action.append(minibatch[i][1])
            reward.append(minibatch[i][2])
            next_state[i] = minibatch[i][3]
            done.append(minibatch[i][4])

        # do batch prediction to save speed
        target = self.model.predict(state)
        target_next = self.model.predict(next_state)

        for i in range(self.batch_size):
            # correction on the Q value for the action used
            if done[i]:
                target[i][action[i]] = reward[i]
            else:
                # Standard - DQN
                # DQN chooses the max Q value among next actions
                # selection and evaluation of action is on the target Q Network
                # Q_max = max_a' Q_target(s', a')
                target[i][action[i]] = reward[i] + self.gamma * (np.amax(target_next[i]))

        # Train the Neural Network with batches
        self.model.fit(state, target, batch_size=self.batch_size, verbose=0)

Let me know if more code is needed. Please answer me. Thank you.

SirPVP
  • 45
  • 5
  • It's a misconception that if a program is using all cores that it will necessarily max out your CPU utilization. If you think about it like this, you probably have hundreds of processes running, your operating system distributes all these unrelated processes across all the cores of your system, but you still have some amount of CPU utilization available. – Joseph Glover Jul 17 '20 at 22:22
  • No I understand that, but the script just takes so long to finish and I can't help but notice that python caan utelize more of my cpu. Is there something I can do. – SirPVP Jul 17 '20 at 22:42
  • I would suggest trying to get your GPU involved. https://www.tensorflow.org/guide/gpu There is a chance that your GPU is already involved according to that webpage. You can also try compiling the tensorflow code from source with options to utilize your GPU: https://www.tensorflow.org/install/source#gpu_support_2 – Joseph Glover Jul 17 '20 at 23:09

0 Answers0