控制 Akka 中消耗大量内存的 actor 的生成

2024-04-01

我使用 akka 的 actor 模型构建了一个分布式流机器学习模型。通过向 Actor 发送训练实例(训练数据)来异步训练模型。对这些数据的训练会占用计算时间并改变参与者的状态。

目前我正在使用历史数据来训练模型。我想运行一堆不同配置的模型,这些模型在相同的数据上进行训练,并查看不同的集成指标有何变化。本质上,这是对 Thread.sleep(1) 和表示计算时间和状态的数据数组进行的操作的简单得多的模拟。

implicit val as = ActorSystem()

case object Report

case class Model(dataSize: Int) {
  val modelActor: ActorRef = actor(new Act {
    val data = Array.fill(dataSize)(0)
    become {
      case trainingData: Int => {
        // Screw with the state of the actor and pretend that it takes time
        Thread.sleep(1)
        data(Math.abs(Random.nextInt % dataSize)) == trainingData
      }
      case Report => {
          println(s"Finished $dataSize")
          context.stop(self)
        }
      }
    })

  def train(trainingInstance: Int) = modelActor ! trainingInstance

  def report: Unit = modelActor ! Report
}

val trainingData = Array.fill(5000)(Random.nextInt)

val dataSizeParams = (1 to 500)

接下来我使用 for 循环来改变参数(由 dataSizeParams 数组表示)

for {
  param <- dataSizeParams
} {
  // make model with params
  val model = Model(param)
  for {
    trainingInstance <- trainingData
  } {
    model.train(trainingInstance)
  }
  model.report
}

for 循环绝对是我想做的事情的错误方式。它并行启动所有不同的模型。当 dataSizeParams 在 1 到 500 范围内时它效果很好,但是如果我将其提高到较高的值,我的模型每个都会开始占用明显的内存块。我想出的是下面的代码。本质上,我有一个模型大师,他可以根据他收到的运行消息的数量来控制同时运行的模型数量。现在,每个模型都包含对此主参与者的引用,并在处理完成后向他发送一条消息:

// Alternative that doesn't use a for loop and instead controls concurrency through what I'm calling a master actor
case object ImDone
case object Run

case class Model(dataSize: Int, master: ActorRef) {
  val modelActor: ActorRef = actor(new Act {
    val data = Array.fill(dataSize)(0)
    become {
      case trainingData: Int => {
        // Screw with the state of the actor and pretend that it takes time
        Tread.sleep(1)
        data(Math.abs(Random.nextInt % dataSize)) == trainingData
      }
      case Report => {
          println(s"Finished $dataSize")
          master ! ImDone
          context.stop(self)
        }
      }
    })

  def train(trainingInstance: Int) = modelActor ! trainingInstance

  def report: Unit = modelActor ! Report
}

val master: ActorRef = actor(new Act {
  var paramRuns = dataSizeParams.toIterator
  become {
    case Run => {
      if (paramRuns.hasNext) {
        val model = Model(paramRuns.next(), self)
        for {
          trainingInstance <- trainingData
        } {
          model.train(trainingInstance)
        }
        model.report
      } else {
        println("No more to run")
        context.stop(self)
      }
    }
    case ImDone =>  {
      self ! Run
    }
  }
})

master ! Run

主代码没有任何问题(我可以看到)。我可以严格控制一次生成的模型数量,但我觉得我缺少一种更简单/干净/开箱即用的方法来做到这一点。另外,我想知道是否有任何巧妙的方法来限制同时运行的模型数量,例如查看系统的 CPU 和内存使用情况。


您正在寻找工作拉动模式。我强烈推荐 Akka 开发者写的这篇博文:

http://letitcrash.com/post/29044669086/balancing-workload-across-nodes-with-akka-2 http://letitcrash.com/post/29044669086/balancing-workload-across-nodes-with-akka-2

我们在 Akka 的集群功能之上使用了一个变体,以避免流氓并发。通过工人演员pull工作而不是有主管push工作时,您可以通过简单地限制工作参与者的数量来优雅地控制工作量(以及 CPU 和内存使用量)。

与纯路由器相比,这有一些优点:更容易跟踪故障(如该帖子所述),并且工作不会在邮箱中滞留(可能会丢失)。

另外,如果您使用远程处理,我建议您not在消息中发送大量数据。让工作节点在触发时自行从另一个源提取数据。我们使用S3。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

控制 Akka 中消耗大量内存的 actor 的生成 的相关文章

  • GO并发编程测试

    我试图确保我的并发程序不存在以下情况 僵局 livelock 饥饿 我找到了以下工具http blog golang org race detector http blog golang org race detector 我尝试编译并运行
  • 为什么 scikit learn 的平均精度分数返回 nan?

    我的 Keras 模型旨在接收两个输入时间序列 将它们连接起来 通过 LSTM 提供它们 并在下一个时间步骤中进行多标签预测 有 50 个训练样本 每个样本有 24 个时间步 每个样本有 5625 个标签 有 12 个验证样本 每个样本有
  • AttributeError:模块“keras.engine”没有属性“Layer”

    当我试图运行时Parking Slot mask rcnn py文件我收到如下错误mrcnn model py文件我该如何解决 gt 2021 06 17 08 25 18 585897 W tensorflow stream execut
  • 哪些 ORM 与 Scala 配合得很好? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 宏:knownDirectSubclasses 被嵌套类型破坏?

    我有一个宏 它枚举密封特征的直接子类型 import scala reflect macros Context import language experimental macros object Checker def apply A U
  • 在函数中将通道作为参数传递的不同方法

    我正在阅读一些Go代码 并说了几种传递Go通道的不同方法 也许它们是相同的 但我想知道是否有任何区别 因为我无法在线找到文档 1 func serve ch lt chan interface do stuff 2 func serve c
  • 如何抑制spark输出控制台中的“Stage 2===>”?

    我有数据帧并试图获取不同的计数并且能够成功获取不同的计数 但是每当 scala 程序执行时我都会收到此消息 Stage 2 gt 1 1 2 我如何在控制台中抑制特定的此消息 val countID dataDF select substr
  • 如何在sklearn决策树中显示特征名称?

    我目前有一个决策树 将功能名称显示为X index i e X 0 X 1 X 2 etc from sklearn import tree from sklearn tree import DecisionTreeClassifier d
  • 如何从 SparkSQL DataFrame 中的 MapType 列获取键和值

    我的镶木地板文件中有数据 该文件有 2 个字段 object id String and alpha Map lt gt 它被读入 SparkSQL 中的数据帧 其架构如下所示 scala gt alphaDF printSchema ro
  • 提高SVM分类器准确率的技术

    我正在尝试使用 UCI 数据集构建一个分类器来预测乳腺癌 我正在使用支持向量机 尽管我尽最大努力提高分类器的准确性 但仍无法超过 97 062 我尝试过以下方法 1 Finding the most optimal C and gamma
  • 如何发现 Scala 远程 Actor 已死亡?

    在 Scala 中 当另一个 远程 actor 终止时 可以通过设置 trapExit 标志并以第二个 actor 作为参数调用 link 方法来通知一个 actor 在这种情况下 当远程参与者通过调用 exit 结束其工作时 第一个参与者
  • 使用 Spray-json 解析简单数组

    我正在尝试 但失败了 了解 Spray json 如何将 json feed 转换为对象 如果我有一个简单的 key gt value json feed 那么它似乎可以正常工作 但是我想要读取的数据出现在如下列表中 name John a
  • 通用特征的隐式转换

    我正在实现一个数据结构 并希望用户能够使用任何类型作为密钥 只要他提供一个合适的密钥类型来包装它 我有这个关键类型的特质 这个想法是进行从基类型到键类型的隐式转换 反之亦然 实际上 只使用基类型 该特征看起来像这样 trait Key T
  • 预处理 csv 文件以与 tflearn 一起使用

    我的问题是关于在将 csv 文件输入神经网络之前对其进行预处理 我想使用 python 3 中的 tflearn 为著名的 iris 数据集构建一个深度神经网络 数据集 http archive ics uci edu ml machine
  • 在 Scala 和 SBT 中调试较长的编译时间

    在我的 Scala SBT 项目中 我有一个文件需要 5 分钟才能编译 所有其他的都可以在几秒钟内编译 这使得开发非常痛苦 我确信我滥用了一些 Scala 构造 但我不知道如何调试它 如何在 Scala 中调试较长的编译时间 我正在使用 S
  • Play Framework 2.3 (Scala) 中的自定义 JSON 验证约束

    我设法使用自定义约束实现表单验证 但现在我想对 JSON 数据执行相同的操作 如何将自定义验证规则应用于 JSON 解析器 示例 客户端的 POST 请求包含用户名 username 我不仅要确保该参数是非空文本 而且还要确保该用户确实存在
  • Scala 和变量中的模式匹配

    我是 Scala 新手 有点想知道模式匹配是如何工作的 想象一下我有以下内容 case class Cls i Int case b Cls i gt Ok case e Cls gt Ok case f Cls gt Ok case s
  • Scala 模式匹配变量绑定

    为什么提取器返回时不能以 样式绑定变量Option
  • 在Spring中使用什么样的“EventBus”?内置、Reactor、Akka?

    我们将在几周后启动一个新的 Spring 4 应用程序 我们希望使用一些事件驱动的架构 今年 我到处读到有关 Reactor 的内容 在网上查找时 我偶然发现了 Akka 所以现在我们有3个选择 春天的ApplicationEvent ht
  • 使用 scala 集合 - CanBuildFrom 麻烦

    我正在尝试编写一个接受任何类型集合的方法CC 并将其映射到一个新的集合 相同的集合类型但不同的元素类型 我正在挣扎 基本上我正在尝试实施map but 不在集合本身上 问题 我正在尝试实现一个带有签名的方法 它看起来有点像 def map

随机推荐

  • 从源代码构建 Clang 时什么时候需要 libc++ 源代码?

    我多年来一直在 Linux 和 OS X 上构建 Clang LLVM 下载页面 http llvm org releases download html 我一直使用以下来源 LLVM LLVM 源 编译器前端 Clang 源 编译器 RT
  • 在Python中混合yield和return语句是个好习惯吗?

    我很想有以下行为 def foo bar None if bar return other function other thing bar else for i in other thing yield other function i
  • Discord JS - 交互创建和消息创建

    我一直在尝试使用交互创建事件 但不知何故它不起作用 我不知道为什么 而且我没有找到有关此事件的确切文档 只知道它用于执行斜杠命令 但是为了这个目的我使用消息创建事件 并且运行良好 const Event require handlers E
  • 点击透明图像像素

    我不希望图像的透明部分可点击 我发现
  • 是否可以在 libGDX 中禁用帧限制?

    更具体地说 是一个桌面 libGDX LWJGL 应用程序 有一些配置选项可以禁用 CPU 同步以及垂直同步 但不管应用程序以 60 fps 运行 这对于所有实际用途来说都很好 但出于好奇 如果没有别的原因 我想看看帧速率可以达到多高 罗德
  • CloudFront 如何在 S3 的现有分发服务网站上设置反向代理

    我有一个 S3 存储桶 它托管一个网站并通过 CloudFront 交付 现在我已将发行版附加到我的顶点根域 例如 www xyz com 因此 之前我们使用 Nginx 从同一域上的网络服务器根提供静态前端 www xyz com 并且还
  • Chart.js 每个点的自定义图像

    我正在使用 Chart js 并且正在寻求有关散点图上每个点的自定义图像的帮助 我尝试过使用 javascript 图像数组 但它不起作用 我是 canvas 和 html5 的新手 我想要的是每个点都是用户的小个人资料图片而不是圆圈 一个
  • 使用 Node.js 的文件系统观察器

    我想使用 node js 实现文件系统观察器 以便它监视特定目录中添加 删除的任何文件 有人可以给出如何实现这个的想法吗 Thanks 查看fs watchFile filename options listener http nodejs
  • 通过模态加载动态 URL

    假设我有以下由循环生成 X 次的链接 a class btn href Launch Modal a 这是启动模式的 JS 脚本 document ready function view more modal remote item vie
  • 权限拒绝:打开提供程序 android.support.v4.content.FileProvider

    我在尝试在 Android 模拟器中执行应用程序升级时遇到了一些问题 场景的流程来自一个 Activity 我将执行异步任务A哪个打开片段A 然后在里面异步任务A 我会检查是否有版本升级 如果可用并且用户选择了 确定 片段A 我将继续异步任
  • 调用需要 API 级别 29(当前最低为 21):`android.widget.NumberPicker#setTextColor`

    我想使用 setTextColor 更改选定的文本颜色字段 但是 Android Studio 给了我这个错误 我应该怎么办 最小 SDK 为 21 这是我的 CustomNumberPicker 类的代码 import android a
  • MongoDb 解释失败:“未知的顶级运算符:$query”

    我试图从非常简单的查询中获得解释 它使用具有以下架构的帖子集合 gt db posts findOne id ObjectId 55236e6182bf196454a952b6 Content wuOfCjKborHcxkoyXzXiW C
  • Mysql CASE WHEN JOIN 语句错误

    Mysql查询 SELECT FROM pet info LEFT JOIN lostpets ON pet info id lostpets petid LEFT JOIN pet images ON pet info id pet im
  • 页面加载后部分渲染

    我有一个包含一些用户控件的页面 我想在回发后加载这些用户控件 就像 ajax 渲染一样 每个用户控件都显示数据库中的列表 我不希望用户在服务器代码构建响应时等待 我认为如果为用户显示页面并且在通过 ajax 请求加载用户控件之后 这将很有用
  • 如何在未来取消时终止 Callable 中的 CXF Web 服务调用

    Edit 这个问题现在已经经历了几次迭代 所以请随意查看修订版本 以了解有关历史和尝试过的事情的一些背景信息 我将 CompletionService 与 ExecutorService 和 Callable 一起使用 通过 CXF 生成的
  • 包含 jQuery 会导致标准 JavaScript 停止运行?

    我正在开始使用 jQuery 我一直在尝试将它与一些预先存在的 JavaScript 代码混合 这样我就不必重写所有内容 我读过很多地方都说这是完全可行的 然而 每当我包含任何 jQuery 行时 标准 JavaScript 就会停止运行
  • RubyKoans:破损的公案?

    可能是业余爱好者的标志 我想知道问题是否出在公案 而不是我 但是 考虑一下这个公案 def test calling global methods without parentheses result my global method 2
  • 取消 ChangeNotifier 内的 Firebase 监听器

    当我尝试取消 Firestore 侦听器时ProductsService cancel 我收到错误 错误 flutter lib ui ui dart state cc 209 未处理的异常 LateInitializationError
  • JSF 2.0 validateRegex 带有自己的验证器消息

    我有一个与此类似的代码
  • 控制 Akka 中消耗大量内存的 actor 的生成

    我使用 akka 的 actor 模型构建了一个分布式流机器学习模型 通过向 Actor 发送训练实例 训练数据 来异步训练模型 对这些数据的训练会占用计算时间并改变参与者的状态 目前我正在使用历史数据来训练模型 我想运行一堆不同配置的模型