code: def update(self, inputs, outputs):
      gt_3d_joints = all_gather(
          inputs["joints_3d"].cuda(ParallelEnv().local_rank)
      )
      has_3d_joints = all_gather(
          inputs["has_3d_joints"].cuda(ParallelEnv().local_rank)
      )
      pred_3d_joints = all_gather(outputs["pose3d"])
      if gt_3d_joints.shape[1] == 24:
          gt_3d_joints = self.get_human36m_joints(gt_3d_joints)
      if pred_3d_joints.shape[1] == 24:
          pred_3d_joints = self.get_human36m_joints(pred_3d_joints)
      mPJPE_val = mean_per_joint_position_error(
          pred_3d_joints, gt_3d_joints, has_3d_joints
      ).mean()
      PAmPJPE_val = reconstruction_error(
          pred_3d_joints.numpy(),
          gt_3d_joints[:, :, :3].numpy(),
          reduction=None,
      ).mean()
      count = int(np.sum(has_3d_joints.numpy()))
      self.PAmPJPE.update(PAmPJPE_val * 1000.0, count)
      self.mPJPE.update(mPJPE_val * 1000.0, count)
  
imports: import paddle
  from paddle.distributed import ParallelEnv
  import os
  import json
  from collections import defaultdict, OrderedDict
  import numpy
  from ppdet.utils.logger import setup_logger
label_desc: Use image node_id 4 for calling the Pose3DEval obj's underlying member method code with example usage: obj.update(inputs, outputs) without return types