mirror of
https://github.com/wassname/ray.git
synced 2026-07-08 18:40:44 +08:00
[Dashboard] Optimize dashboard datacenter (#11391)
* Optimize dashboard datacenter * Fix tests * Fix tests * Fix * Fix CI * python/build-wheel-macos.sh Co-authored-by: 刘宝 <po.lb@antfin.com> Co-authored-by: Max Fitton <maxfitton@anyscale.com>
This commit is contained in:
@@ -13,6 +13,7 @@ MACPYTHON_URL=https://www.python.org/ftp/python
|
||||
MACPYTHON_PY_PREFIX=/Library/Frameworks/Python.framework/Versions
|
||||
DOWNLOAD_DIR=python_downloads
|
||||
|
||||
NODE_VERSION="14"
|
||||
PY_VERSIONS=("3.6.1"
|
||||
"3.7.0"
|
||||
"3.8.2")
|
||||
@@ -36,6 +37,7 @@ mkdir -p .whl
|
||||
|
||||
# Use the latest version of Node.js in order to build the dashboard.
|
||||
source "$HOME"/.nvm/nvm.sh
|
||||
nvm install $NODE_VERSION
|
||||
nvm use node
|
||||
|
||||
# Build the dashboard so its static assets can be included in the wheel.
|
||||
|
||||
@@ -81,7 +81,7 @@ class DashboardController(BaseDashboardController):
|
||||
def _construct_raylet_info(self):
|
||||
D = self.raylet_stats.get_raylet_stats()
|
||||
workers_info_by_node = {
|
||||
data["nodeId"]: data.get("workersStats")
|
||||
data["nodeId"]: data.get("coreWorkersStats")
|
||||
for data in D.values()
|
||||
}
|
||||
|
||||
|
||||
@@ -159,20 +159,18 @@ class NodeStats(threading.Thread):
|
||||
actors[actor_id].update(self._addr_to_extra_info_dict[addr])
|
||||
|
||||
for node_id, workers_info in workers_info_by_node.items():
|
||||
for worker_info in workers_info:
|
||||
if "coreWorkerStats" in worker_info:
|
||||
core_worker_stats = worker_info["coreWorkerStats"]
|
||||
addr = (core_worker_stats["ipAddress"],
|
||||
str(core_worker_stats["port"]))
|
||||
if addr in self._addr_to_actor_id:
|
||||
actor_info = actors[self._addr_to_actor_id[addr]]
|
||||
format_reply_id(core_worker_stats)
|
||||
actor_info.update(core_worker_stats)
|
||||
actor_info["averageTaskExecutionSpeed"] = round(
|
||||
actor_info["numExecutedTasks"] /
|
||||
(now - actor_info["timestamp"] / 1000), 2)
|
||||
actor_info["nodeId"] = node_id
|
||||
actor_info["pid"] = worker_info["pid"]
|
||||
for core_worker_stats in workers_info:
|
||||
addr = (core_worker_stats["ipAddress"],
|
||||
str(core_worker_stats["port"]))
|
||||
if addr in self._addr_to_actor_id:
|
||||
actor_info = actors[self._addr_to_actor_id[addr]]
|
||||
format_reply_id(core_worker_stats)
|
||||
actor_info.update(core_worker_stats)
|
||||
actor_info["averageTaskExecutionSpeed"] = round(
|
||||
actor_info["numExecutedTasks"] /
|
||||
(now - actor_info["timestamp"] / 1000), 2)
|
||||
actor_info["nodeId"] = node_id
|
||||
actor_info["pid"] = core_worker_stats["pid"]
|
||||
|
||||
def _update_from_actor_tasks(task, task_spec_type,
|
||||
invalid_state_type):
|
||||
@@ -183,8 +181,9 @@ class NodeStats(threading.Thread):
|
||||
elif invalid_state_type == "infeasibleActor":
|
||||
task["state"] = -2
|
||||
else:
|
||||
raise ValueError(f"Invalid argument"
|
||||
"invalid_state_type={invalid_state_type}")
|
||||
raise ValueError(
|
||||
"Invalid argument"
|
||||
f"invalid_state_type={invalid_state_type}")
|
||||
task["actorTitle"] = task["functionDescriptor"][
|
||||
"pythonFunctionDescriptor"]["className"]
|
||||
format_reply_id(task)
|
||||
|
||||
@@ -4,6 +4,7 @@ import requests
|
||||
import time
|
||||
|
||||
import ray
|
||||
from ray.core.generated import common_pb2
|
||||
from ray.core.generated import node_manager_pb2
|
||||
from ray.core.generated import node_manager_pb2_grpc
|
||||
from ray.test_utils import (RayTestTimeoutException,
|
||||
@@ -36,7 +37,10 @@ def test_worker_stats(shutdown_only):
|
||||
|
||||
reply = try_get_node_stats()
|
||||
# Check that there is one connected driver.
|
||||
drivers = [worker for worker in reply.workers_stats if worker.is_driver]
|
||||
drivers = [
|
||||
worker for worker in reply.core_workers_stats
|
||||
if worker.worker_type == common_pb2.DRIVER
|
||||
]
|
||||
assert len(drivers) == 1
|
||||
assert os.getpid() == drivers[0].pid
|
||||
|
||||
@@ -58,11 +62,10 @@ def test_worker_stats(shutdown_only):
|
||||
worker_pid = ray.get(f.remote())
|
||||
reply = try_get_node_stats()
|
||||
target_worker_present = False
|
||||
for worker in reply.workers_stats:
|
||||
stats = worker.core_worker_stats
|
||||
for stats in reply.core_workers_stats:
|
||||
if stats.webui_display[""] == '{"message": "test", "dtype": "text"}':
|
||||
target_worker_present = True
|
||||
assert worker.pid == worker_pid
|
||||
assert stats.pid == worker_pid
|
||||
else:
|
||||
assert stats.webui_display[""] == "" # Empty proto
|
||||
assert target_worker_present
|
||||
@@ -72,11 +75,10 @@ def test_worker_stats(shutdown_only):
|
||||
worker_pid = ray.get(a.f.remote())
|
||||
reply = try_get_node_stats()
|
||||
target_worker_present = False
|
||||
for worker in reply.workers_stats:
|
||||
stats = worker.core_worker_stats
|
||||
for stats in reply.core_workers_stats:
|
||||
if stats.webui_display[""] == '{"message": "test", "dtype": "text"}':
|
||||
target_worker_present = True
|
||||
assert worker.pid == worker_pid
|
||||
assert stats.pid == worker_pid
|
||||
else:
|
||||
assert stats.webui_display[""] == "" # Empty proto
|
||||
assert target_worker_present
|
||||
@@ -89,15 +91,15 @@ def test_worker_stats(shutdown_only):
|
||||
"Timed out while waiting for worker processes")
|
||||
|
||||
# Wait for the workers to start.
|
||||
if len(reply.workers_stats) < num_cpus + 1:
|
||||
if len(reply.core_workers_stats) < num_cpus + 1:
|
||||
time.sleep(1)
|
||||
reply = try_get_node_stats()
|
||||
continue
|
||||
|
||||
# Check that the rest of the processes are workers, 1 for each CPU.
|
||||
assert len(reply.workers_stats) == num_cpus + 1
|
||||
assert len(reply.core_workers_stats) == num_cpus + 1
|
||||
# Check that all processes are Python.
|
||||
pids = [worker.pid for worker in reply.workers_stats]
|
||||
pids = [worker.pid for worker in reply.core_workers_stats]
|
||||
processes = [
|
||||
p.info["name"] for p in psutil.process_iter(attrs=["pid", "name"])
|
||||
if p.info["pid"] in pids
|
||||
|
||||
@@ -8,6 +8,7 @@ import pytest
|
||||
|
||||
import ray
|
||||
import ray.test_utils
|
||||
from ray.core.generated import common_pb2
|
||||
from ray.core.generated import node_manager_pb2, node_manager_pb2_grpc
|
||||
from ray.test_utils import (wait_for_condition, wait_for_pid_to_exit,
|
||||
run_string_as_driver,
|
||||
@@ -22,8 +23,8 @@ def get_workers():
|
||||
stub = node_manager_pb2_grpc.NodeManagerServiceStub(channel)
|
||||
return [
|
||||
worker for worker in stub.GetNodeStats(
|
||||
node_manager_pb2.GetNodeStatsRequest()).workers_stats
|
||||
if not worker.is_driver
|
||||
node_manager_pb2.GetNodeStatsRequest()).core_workers_stats
|
||||
if worker.worker_type != common_pb2.DRIVER
|
||||
]
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user