def check_and_update_resources(num_cpus, num_gpus, resources):
    """Sanity check a resource dictionary and add sensible defaults.

    Args:
        num_cpus: The number of CPUs.
        num_gpus: The number of GPUs.
        resources: A dictionary mapping resource names to resource quantities.

    Returns:
        A new resource dictionary.
    """
    if resources is None:
        resources = {}
    resources = resources.copy()
    assert "CPU" not in resources
    assert "GPU" not in resources
    if num_cpus is not None:
        resources["CPU"] = num_cpus
    if num_gpus is not None:
        resources["GPU"] = num_gpus

    if "CPU" not in resources:
        # By default, use the number of hardware execution threads for the
        # number of cores.
        resources["CPU"] = multiprocessing.cpu_count()

    # See if CUDA_VISIBLE_DEVICES has already been set.
    gpu_ids = ray.utils.get_cuda_visible_devices()

    # Check that the number of GPUs that the raylet wants doesn't
    # excede the amount allowed by CUDA_VISIBLE_DEVICES.
    if ("GPU" in resources and gpu_ids is not None
            and resources["GPU"] > len(gpu_ids)):
        raise Exception("Attempting to start raylet with {} GPUs, "
                        "but CUDA_VISIBLE_DEVICES contains {}.".format(
                            resources["GPU"], gpu_ids))

    if "GPU" not in resources:
        # Try to automatically detect the number of GPUs.
        resources["GPU"] = _autodetect_num_gpus()
        # Don't use more GPUs than allowed by CUDA_VISIBLE_DEVICES.
        if gpu_ids is not None:
            resources["GPU"] = min(resources["GPU"], len(gpu_ids))

    resources = {
        resource_label: resource_quantity
        for resource_label, resource_quantity in resources.items()
        if resource_quantity != 0
    }

    # Check types.
    for _, resource_quantity in resources.items():
        assert (isinstance(resource_quantity, int)
                or isinstance(resource_quantity, float))
        if (isinstance(resource_quantity, float)
                and not resource_quantity.is_integer()):
            raise ValueError(
                "Resource quantities must all be whole numbers. Received {}.".
                format(resources))
        if resource_quantity < 0:
            raise ValueError(
                "Resource quantities must be nonnegative. Received {}.".format(
                    resources))
        if resource_quantity > ray_constants.MAX_RESOURCE_QUANTITY:
            raise ValueError("Resource quantities must be at most {}.".format(
                ray_constants.MAX_RESOURCE_QUANTITY))

    return resources
def check_and_update_resources ( num_cpus , num_gpus , resources ) : if resources is None : resources = { } resources = resources . copy ( ) assert "CPU" not in resources assert "GPU" not in resources if num_cpus is not None : resources [ "CPU" ] = num_cpus if num_gpus is not None : resources [ "GPU" ] = num_gpus if "CPU" not in resources : resources [ "CPU" ] = multiprocessing . cpu_count ( ) gpu_ids = ray . utils . get_cuda_visible_devices ( ) if ( "GPU" in resources and gpu_ids is not None and resources [ "GPU" ] > len ( gpu_ids ) ) : raise Exception ( "Attempting to start raylet with {} GPUs, " "but CUDA_VISIBLE_DEVICES contains {}." . format ( resources [ "GPU" ] , gpu_ids ) ) if "GPU" not in resources : resources [ "GPU" ] = _autodetect_num_gpus ( ) if gpu_ids is not None : resources [ "GPU" ] = min ( resources [ "GPU" ] , len ( gpu_ids ) ) resources = { resource_label : resource_quantity for resource_label , resource_quantity in resources . items ( ) if resource_quantity != 0 } for _ , resource_quantity in resources . items ( ) : assert ( isinstance ( resource_quantity , int ) or isinstance ( resource_quantity , float ) ) if ( isinstance ( resource_quantity , float ) and not resource_quantity . is_integer ( ) ) : raise ValueError ( "Resource quantities must all be whole numbers. Received {}." . format ( resources ) ) if resource_quantity < 0 : raise ValueError ( "Resource quantities must be nonnegative. Received {}." . format ( resources ) ) if resource_quantity > ray_constants . MAX_RESOURCE_QUANTITY : raise ValueError ( "Resource quantities must be at most {}." . format ( ray_constants . MAX_RESOURCE_QUANTITY ) ) return resources
Sanity check a resource dictionary and add sensible defaults.

    Args:
        num_cpus: The number of CPUs.
        num_gpus: The number of GPUs.
        resources: A dictionary mapping resource names to resource quantities.

    Returns:
        A new resource dictionary.