code: def download_from_cloud(
      self, key: str, target: str, delete_after_download: bool = False
  ):
      if self.cloud_storage_provider == S3_CLOUD_STORAGE:
          self._run_with_retry(
              lambda: self.s3_client.download_file(
                  Bucket=self.bucket,
                  Key=key,
                  Filename=target,
              )
          )
      if self.cloud_storage_provider == GS_CLOUD_STORAGE:
          bucket = self.gs_client.bucket(self.bucket)
          blob = bucket.blob(key)
          self._run_with_retry(
              lambda: blob.download_to_filename(target)
          )
  
      if delete_after_download:
          self.delete(key)
  
imports: import os
  import shutil
  import sys
  import tempfile
  from typing import Optional
  import boto3
  from google.cloud import storage
  from ray_release.aws import RELEASE_AWS_BUCKET
  from ray_release.cluster_manager.cluster_manager import ClusterManager
  from ray_release.exception import FileDownloadError, FileUploadError
  from ray_release.file_manager.file_manager import FileManager
  from ray_release.job_manager import JobManager
  from ray_release.logger import logger
  from ray_release.util import exponential_backoff_retry, generate_tmp_cloud_storage_path, S3_CLOUD_STORAGE, GS_CLOUD_STORAGE, GS_BUCKET
label_desc: Use image node_id 4 for calling the JobFileManager obj's underlying member method code with example usage: obj.download_from_cloud(key, target, delete_after_download) without return types