def setup(self, runtime_env: RuntimeEnv, context: RuntimeEnvContext, logger: Optional[logging.Logger] = default_logger): if not runtime_env.has_conda() and not runtime_env.has_pip(): return logger.debug("Setting up conda or pip for runtime_env: " f"{runtime_env.serialize()}") if runtime_env.conda_env_name(): conda_env_name = runtime_env.conda_env_name() else: conda_dict = get_conda_dict(runtime_env, self._resources_dir) protocol, hash = parse_uri(runtime_env.conda_uri()) conda_env_name = self._get_path_from_hash(hash) assert conda_dict is not None ray_pip = current_ray_pip_specifier(logger=logger) if ray_pip: extra_pip_dependencies = [ray_pip, "ray[default]"] elif runtime_env.get_extension("_inject_current_ray") == "True": extra_pip_dependencies = ( _resolve_install_from_source_ray_dependencies()) else: extra_pip_dependencies = [] conda_dict = inject_dependencies(conda_dict, _current_py_version(), extra_pip_dependencies) # It is not safe for multiple processes to install conda envs # concurrently, even if the envs are different, so use a global # lock for all conda installs. # See https://github.com/ray-project/ray/issues/17086 file_lock_name = "ray-conda-install.lock" with FileLock(os.path.join(self._resources_dir, file_lock_name)): try: conda_yaml_file = os.path.join(self._resources_dir, "environment.yml") with open(conda_yaml_file, "w") as file: yaml.dump(conda_dict, file) if conda_env_name in self._created_envs: logger.debug(f"Conda env {conda_env_name} already " "created, skipping creation.") else: create_conda_env(conda_yaml_file, prefix=conda_env_name, logger=logger) self._created_envs.add(conda_env_name) finally: os.remove(conda_yaml_file) if runtime_env.get_extension("_inject_current_ray"): _inject_ray_to_conda_site(conda_path=conda_env_name, logger=logger) context.py_executable = "python" context.command_prefix += get_conda_activate_commands(conda_env_name) logger.info( f"Finished setting up runtime environment at {conda_env_name}")
async def setup( self, runtime_env: "RuntimeEnv", # noqa: F821 context: RuntimeEnvContext, logger: Optional[logging.Logger] = default_logger, ): if not runtime_env.has_py_container( ) or not runtime_env.py_container_image(): return container_driver = "podman" container_command = [ container_driver, "run", "-v", self._ray_tmp_dir + ":" + self._ray_tmp_dir, "--cgroup-manager=cgroupfs", "--network=host", "--pid=host", "--ipc=host", "--env-host", ] container_command.append("--env") container_command.append("RAY_RAYLET_PID=" + os.getenv("RAY_RAYLET_PID")) if runtime_env.py_container_run_options(): container_command.extend(runtime_env.py_container_run_options()) # TODO(chenk008): add resource limit container_command.append("--entrypoint") container_command.append("python") container_command.append(runtime_env.py_container_image()) context.py_executable = " ".join(container_command) logger.info("start worker in container with prefix: {}".format( context.py_executable))
def modify_context( self, uris: List[str], runtime_env: "RuntimeEnv", # noqa: F821 context: RuntimeEnvContext, logger: Optional[logging.Logger] = default_logger, ): if not runtime_env.has_pip(): return # PipPlugin only uses a single URI. uri = uris[0] # Update py_executable. protocol, hash = parse_uri(uri) target_dir = self._get_path_from_hash(hash) virtualenv_python = _PathHelper.get_virtualenv_python(target_dir) if not os.path.exists(virtualenv_python): raise ValueError( f"Local directory {target_dir} for URI {uri} does " "not exist on the cluster. Something may have gone wrong while " "installing the runtime_env `pip` packages.") context.py_executable = virtualenv_python context.command_prefix += [ _PathHelper.get_virtualenv_activate_command(target_dir) ]
def modify_context(uri: str, plugin_config_dict: dict, ctx: RuntimeEnvContext) -> None: ctx.env_vars[MyPlugin.env_key] = str(plugin_config_dict["env_value"]) ctx.command_prefix.append( f"echo {plugin_config_dict['tmp_content']} > " f"{plugin_config_dict['tmp_file']}") ctx.py_executable = (plugin_config_dict["prefix_command"] + " " + ctx.py_executable)
def modify_context( self, uris: List[str], plugin_config_dict: dict, ctx: RuntimeEnvContext, logger: logging.Logger, ) -> None: ctx.env_vars[MyPlugin.env_key] = str(plugin_config_dict["env_value"]) ctx.command_prefix.append( f"echo {plugin_config_dict['tmp_content']} > " f"{plugin_config_dict['tmp_file']}") ctx.py_executable = (plugin_config_dict["prefix_command"] + " " + ctx.py_executable)
def setup(self, runtime_env: dict, context: RuntimeEnvContext, logger: Optional[logging.Logger] = default_logger): if not runtime_env.get("conda") and not runtime_env.get("pip"): return logger.debug(f"Setting up conda or pip for runtime_env: {runtime_env}") conda_dict = get_conda_dict(runtime_env, self._resources_dir) if isinstance(runtime_env.get("conda"), str): conda_env_name = runtime_env["conda"] else: assert conda_dict is not None ray_pip = current_ray_pip_specifier(logger=logger) if ray_pip: extra_pip_dependencies = [ray_pip, "ray[default]"] elif runtime_env.get("_inject_current_ray"): extra_pip_dependencies = ( _resolve_install_from_source_ray_dependencies()) else: extra_pip_dependencies = [] conda_dict = inject_dependencies(conda_dict, _current_py_version(), extra_pip_dependencies) logger.info(f"Setting up conda environment with {runtime_env}") # It is not safe for multiple processes to install conda envs # concurrently, even if the envs are different, so use a global # lock for all conda installs. # See https://github.com/ray-project/ray/issues/17086 file_lock_name = "ray-conda-install.lock" with FileLock(os.path.join(self._resources_dir, file_lock_name)): conda_dir = os.path.join(self._resources_dir, "conda") try_to_create_directory(conda_dir) conda_yaml_path = os.path.join(conda_dir, "environment.yml") with open(conda_yaml_path, "w") as file: # Sort keys because we hash based on the file contents, # and we don't want the hash to depend on the order # of the dependencies. yaml.dump(conda_dict, file, sort_keys=True) conda_env_name = get_or_create_conda_env(conda_yaml_path, conda_dir, logger=logger) if runtime_env.get("_inject_current_ray"): conda_path = os.path.join(conda_dir, conda_env_name) _inject_ray_to_conda_site(conda_path, logger=logger) context.py_executable = "python" context.command_prefix += get_conda_activate_commands(conda_env_name) logger.info( f"Finished setting up runtime environment at {conda_env_name}")
def modify_context( self, uri: str, runtime_env: "RuntimeEnv", # noqa: F821 context: RuntimeEnvContext, logger: Optional[logging.Logger] = default_logger, ): if not runtime_env.has_conda(): return if runtime_env.conda_env_name(): conda_env_name = runtime_env.conda_env_name() else: protocol, hash = parse_uri(runtime_env.conda_uri()) conda_env_name = self._get_path_from_hash(hash) context.py_executable = "python" context.command_prefix += get_conda_activate_commands(conda_env_name)
def modify_context( self, uri: str, runtime_env: RuntimeEnv, context: RuntimeEnvContext, logger: Optional[logging.Logger] = default_logger, ): if not runtime_env.has_pip(): return # Update py_executable. protocol, hash = parse_uri(uri) target_dir = self._get_path_from_hash(hash) virtualenv_python = _PathHelper.get_virtualenv_python(target_dir) if not os.path.exists(virtualenv_python): raise ValueError( f"Local directory {target_dir} for URI {uri} does " "not exist on the cluster. Something may have gone wrong while " "installing the runtime_env `pip` packages.") context.py_executable = virtualenv_python