babyAGI(3)-COOPERATIVE_MODE

2024-03-31 14:20
文章标签 mode cooperative babyagi

本文主要是介绍babyAGI(3)-COOPERATIVE_MODE,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

babyAGI中有cooperative模式,其核心是调用ray库,实现分布式多进程执行任务。

从BabyAGI的源码中,我们可以学习ray core的使用。

1. Ray核心概念

1.1 Tasks

Ray 允许在单独的 Python 工作线程上异步执行任意函数。 这些异步执行的函数被称为“tasks”。 Ray 使任务能够根据 CPU、GPU 或自定义其资源需求。 Ray的集群调度程序根据资源请求在集群中分配任务实现并行执行。

1.2 Actors

一个actor本质上是一个有状态的worker或者服务。当一个新的 Actor 被实例化时,就会创建一个新的 Worker,并且 Actor 的方法会调度到该特定的 Worker 上,并且可以访问和改变该 Worker 的状态。 与任务一样,参与者支持 CPU、GPU 和自定义资源要求。

1.3 Objects

在 Ray 中,Tasks和 Actors在Object上创建和计算。 我们将这些对象称为远程对象,因为它们可以存储在 Ray 集群中的任何位置,并且我们使用对象引用来引用它们。

远程对象缓存在 Ray 的分布式共享内存对象存储中,集群中的每个节点都有一个对象存储。

在集群设置中,远程对象可以存在于一个或多个节点上,与持有对象引用的人无关。

1.4 Placement Group

组允许用户跨多个节点自动保留资源组(即组调度)。 然后,它们可用于安排 Ray 任务和 actor,使其尽可能的靠近本地(PACK)或分散(SPREAD)。 组通常用于调度actor,但也用于支持task。

1.5 环境依赖

当 Ray 在远程计算机上执行任务和 Actor 时,它们的环境依赖项(例如 Python 包、本地文件、环境变量)必须可供代码运行。 为了解决这个问题,可以

  1. 使用 Ray Cluster Launcher 提前准备集群上的依赖项
  2. 使用 Ray 的运行时环境即时安装它们

2. BabyAGI中的Ray代码

ray.init这个函数作用主要是连接到一个已经存在ray集群或者创建一个集群然后连接到它

使用ray.remote装饰python类,会将此类变为一个actors。每一个actor都会运行在自有的python进程中。

下面的代码定义一个cooperative模式的多个目标的存储actor。

使用队列存储多个目标,然后将目标调度到不同的远程对象上执行。

ACTOR_NAME="BabyAGI Objectives"try:ray.init(address="auto", namespace="babyagi", logging_level=logging.FATAL, ignore_reinit_error=True)
except:ray.init(namespace="babyagi", logging_level=logging.FATAL, ignore_reinit_error=True)@ray.remote
class CooperativeObjectivesListStorageActor:def __init__(self):self.objectives = deque([])def append(self, objective: str):if not objective in self.objectives:self.objectives.append(objective)def is_empty(self):return False if self.objectives else Truedef get_objective_names(self):return [t for t in self.objectives]class CooperativeObjectivesListStorage:def __init__(self):try:self.actor = ray.get_actor(name=ACTOR_NAME, namespace="babyagi")except ValueError:self.actor = CooperativeObjectivesListStorageActor.options(name=ACTOR_NAME, namespace="babyagi", lifetime="detached").remote()def append(self, objective: str):self.actor.append.remote(objective)def is_empty(self):return ray.get(self.actor.is_empty.remote())def get_objective_names(self):return ray.get(self.actor.get_objective_names.remote())

但是,这段代码并没有放到主体的程序当中,估计是作者没有实现多目标的调度执行。

接下来我们看看,用到的协同的任务清单代码。

import sys
import logging
import ray
from collections import deque
from typing import Dict, Listfrom pathlib import Path
sys.path.append(str(Path(__file__).resolve().parent.parent))
from extensions.ray_objectives import CooperativeObjectivesListStoragetry:ray.init(address="auto", namespace="babyagi", logging_level=logging.FATAL, ignore_reinit_error=True)
except:ray.init(namespace="babyagi", logging_level=logging.FATAL, ignore_reinit_error=True)@ray.remote
class CooperativeTaskListStorageActor:def __init__(self):self.tasks = deque([])self.task_id_counter = 0def append(self, task: Dict):self.tasks.append(task)def replace(self, tasks: List[Dict]):self.tasks = deque(tasks)def popleft(self):return self.tasks.popleft()def is_empty(self):return False if self.tasks else Truedef next_task_id(self):self.task_id_counter += 1return self.task_id_counterdef get_task_names(self):return [t["task_name"] for t in self.tasks]class CooperativeTaskListStorage:def __init__(self, name: str):self.name = nametry:self.actor = ray.get_actor(name=self.name, namespace="babyagi")except ValueError:self.actor = CooperativeTaskListStorageActor.options(name=self.name, namespace="babyagi", lifetime="detached").remote()objectives = CooperativeObjectivesListStorage()objectives.append(self.name)def append(self, task: Dict):self.actor.append.remote(task)def replace(self, tasks: List[Dict]):self.actor.replace.remote(tasks)def popleft(self):return ray.get(self.actor.popleft.remote())def is_empty(self):return ray.get(self.actor.is_empty.remote())def next_task_id(self):return ray.get(self.actor.next_task_id.remote())def get_task_names(self):return ray.get(self.actor.get_task_names.remote())

基本就是SingleTaskListStorage的翻版,不过多增加远程调度的功能,而且任务不再是以dict形式存储,而是存放在集群当中。

因此,需要每次都进行优先级的排序,否则任务会被重复执行。

以上,就是cooperation模式的代码,整个看起来用处不大,可能任务比较多的时候有效,但瓶颈还是会在优先级排列的任务上。

下一篇文章,我们可以看看作者的另一段代码,babycoder实现的coder的agi

这篇关于babyAGI(3)-COOPERATIVE_MODE的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/864545

相关文章

Unstructured cannot write mode RGBA as JPEG 错误解决

Unstructured cannot write mode RGBA as JPEG 错误解决 0. 错误详细1. 解决方法 0. 错误详细 Image Extraction Error: Skipping the failed imageTraceback (most recent call last):File "/root/miniconda3/envs/learn-y

混合模式属性background-blend-mode

background-blend-mode 是 CSS 中的一个属性,它允许你将背景图像与背景颜色或背景图像之间以一种特定的混合模式进行混合。这个属性为网页设计师提供了一种强大的方式来创建视觉上吸引人的背景效果,无需使用图像编辑软件或额外的图像文件。 background-blend-mode 可以应用于单个背景图像与背景颜色之间,或者当设置多个背景图像时,应用于这些图像之间。混合模式包括了许多

【Mysql】系统服务启动访问报错问题处理:this is incompatible with sql_mode=only_full_group_by

一、背景: 本来已经正常运行的平台,突然有一天由于对服务器进行部分操作迁移,发现jar可以正常启动,但是访问功能一直报错,监控后台日志后,发现了问题: 报错的具体信息如下: Caused by: java.sql.SQLSyntaxErrorException: Expression #1 of SELECT list is not in GROUP BY clause and conta

Hugging Face Offline Mode 离线模式

Hugging Face Offline Mode 离线模式 1. 缓存管理2. 遥测日志 在使用 Hugging Face 的库时,缓存和遥测日志是两个重要的功能。本文将介绍如何管理缓存、启用离线模式以及如何关闭遥测日志。 1. 缓存管理 在使用 Hugging Face 模型时,权重和文件通常会从 Hub 下载并存储在默认的缓存目录中,这个目录通常位于用户的主目录。如果

关闭qcom soc系列手机的ramdump mode

在 kernel/msm-3.10 / arch/arm64/configs/ze550kl_user_defconfig中 将CONFIG_MSM_DLOAD_MODE=y改成 #CONFIG_MSM_DLOAD_MODE is not set 然后在/ drivers/power/reset/msm-poweroff.c中将 if (!in_panic) { // Normal re

CUDA-MODE课程笔记 第9课: 归约(也对应PMPP的第10章)

我的课程笔记,欢迎关注:https://github.com/BBuf/how-to-optim-algorithm-in-cuda/tree/master/cuda-mode CUDA-MODE课程笔记 第9课: 归约(也对应PMPP的第10章) 课程笔记 本节课的题目。 这节课的内容主要是 Chapter 10 of PMPP book ,Slides里面还给出了本节课的

初探UML(User-Mode-Linux)

由标题我们已经知道这里要说的UML不是“统一建模语言”,而是“用户模式的Linux”,使用它有什么好处呢?让我们先保留点神秘感,一步一步学习,通过实践来感悟它的魅力。 实验环境:电脑一台(装有Ubuntu13.10系统,Kernel版本为3.11.0-12-generic,64位) 下面将通过UML环境的搭建、GDB调试、网络测试这3个方面来了解下UML: 一.搭建UML实验环境 1.下载

MySQL 主从幂等复制slave_exec_mode=IDEMPOTENT

MySQL slave_exec_mode 参数用于控制主从复制数据冲突时的处理策略,可选值有STRICT和IDEMPOTENT,分别代表严格模式和幂等模式,默认值为STRICT,该参数可动态调整。 原文地址: https://mytecdb.com/blogDetail.php?id=76 STRICT,严格模式IDEMPOTENT,幂等模式 默认STRICT模式下,从库复制过程中

MYSQL5.7版本sql_mode=only_full_group_by问题,重启有效的方法

1./etc/mysql/mysql.conf.d/mysqld.cnf 或者my.cnf   总之就是mysql的配置文件 2.查看当前的sql模式 select @@sql_mode; 3.添加语句 sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CR

第二十九篇:USER MODE DLL开发过程中的调试技巧心得分享

最近由于项目需要,被老板安排开发一个WINDOWS USER MODE DLL, 即WINDOWS用户模式下的动态链接库。 写代码,实现具体的功能这类初等工作,对于大多数软件开发工程师来讲,只是时间与工作量上的问题,具体的WINDOWS DLL的知识点,本人参考了Jeffrey Richter的《WINDOWS核心编程》中的DLL几章,不再熬述。 这里谈一下关于USER MODE