【问题标题】:Distribute resources accross H2O nodes in a multi-node cluster在多节点集群中跨 H2O 节点分配资源
【发布时间】:2021-11-10 16:06:37
【问题描述】:

我有 2 个 docker 容器运行我的 webapp 和我的机器学习应用程序,它们都使用 h2o。最初,我调用 h2o.init() 并指向同一个 IP:PORT,因此初始化了一个具有一个节点的单个 h2o 集群。

假设我已经训练了一个模型,现在我正在训练第二个模型。在这个训练过程中,如果 webapp 调用 h2o 集群(例如,请求第一个模型的预测),它将终止训练过程(错误消息如下),这是无意的。我尝试为每个应用程序设置不同的端口,但同样的情况不断发生。我不明白为什么,因为我认为通过设置两个不同的端口,会初始化两个独立的集群,因此可以同时运行两个作业。

错误信息

Job request failed Server error java.lang.IllegalArgumentException:
      Error: Job is missing
      Request: GET /3/Jobs/$0301c0a8f00232d4ffffffff$_911222b9c2e4404c31191c0d3ffd44c6, will retry after 3s.

或者,我将 H2O 移到了自己的容器中,并尝试设置一个多节点集群,以便每个应用程序都在一个节点上运行。 Bellow 是用于启动集群的 Dockerfile 和 entrypoint.sh 文件:

Dockerfile

########################################################################
# Dockerfile for Oracle JDK 8 on Ubuntu 16.04
########################################################################

# pull base image
FROM ubuntu:16.04

RUN \
    echo 'DPkg::Post-Invoke {"/bin/rm -f /var/cache/apt/archives/*.deb || true";};' | tee /etc/apt/apt.conf.d/no-cache && \
    echo "deb http://mirror.math.princeton.edu/pub/ubuntu xenial main universe" >> /etc/apt/sources.list && \
    apt-get update -q -y && \
    apt-get dist-upgrade -y && \
    apt-get clean && \
    rm -rf /var/cache/apt/* && \
    DEBIAN_FRONTEND=noninteractive apt-get install -y wget unzip openjdk-8-jdk python-pip python-sklearn python-pandas python-numpy python-matplotlib software-properties-common python-software-properties && \
    apt-get clean

# Fetch h2o
ENV H2O_RELEASE rel-zipf
ENV H2O_VERSION 3.32.1.7
RUN \
    wget http://h2o-release.s3.amazonaws.com/h2o/${H2O_RELEASE}/$(echo $H2O_VERSION | cut -d "." -f4)/h2o-${H2O_VERSION}.zip -O /opt/h2o.zip && \
    unzip -d /opt /opt/h2o.zip && \
    rm /opt/h2o.zip && \
    cd /opt && \
    cd `find . -name 'h2o.jar' | sed 's/.\///;s/\/h2o.jar//g'` && \
    cp h2o.jar /opt && \
    /usr/bin/pip install `find . -name "*.whl"`

# Define the working directory
WORKDIR \
    /home/h2o

EXPOSE 54321-54326

# Define entrypoint
COPY ./bin/entrypoint.sh ./entrypoint.sh
RUN chmod +x entrypoint.sh
ENTRYPOINT ["./entrypoint.sh"]

entrypoint.sh

#!/bin/bash
# Entrypoint script.

set -e

d=`dirname $0`

# Use 90% of RAM for H2O, 30% for each node.
memTotalKb=`cat /proc/meminfo | grep MemTotal | sed 's/MemTotal:[ \t]*//' | sed 's/ kB//'`
memTotalMb=$[ $memTotalKb / 1024 ]
tmp=$[ $memTotalMb * 30 ]
xmxMb=$[ $tmp / 100 ]

# Use all 36 cores for H2O, 12 for each node.
totalCores=`lscpu | grep "^CPU(s)" | sed 's/CPU(s):[ \t]*//'`
nthreads=$[ $totalCores / 3 ]

# First try running java.
java -version

# Start 2 H2O nodes in the background
nohup java -Xmx${xmxMb}m -jar /opt/h2o.jar -nthreads ${nthreads} -name ${H2O_CLUSTER_NAME} -port ${H2O_NODE_2_PORT} &
nohup java -Xmx${xmxMb}m -jar /opt/h2o.jar -nthreads ${nthreads} -name ${H2O_CLUSTER_NAME} -port ${H2O_NODE_3_PORT} & 

# Start the 3rd node.
java -Xmx${xmxMb}m -jar /opt/h2o.jar -nthreads ${nthreads} -name ${H2O_CLUSTER_NAME} -port ${H2O_NODE_1_PORT}

可以看出,我一共启动了3个节点(webapp一次可以请求2个操作),每个节点在不同的端口(端口54321、54323和54325。IP相同),我设置了内存占每个节点总内存的 30%,nthreads 占可用内核的三分之一(总共 36 个,每个节点 12 个)。集群从 3 个节点开始正常,但是,与我的预期相反,每个节点都有 36 个核心而不是 12 个(总共 108 个),如下图所示,导致了我之前遇到的相同错误。

H2O 3-node cluster

我查看了其他 stackoverflow 帖子以及 H2O 文档,但找不到任何适合我的东西。如何配置 H2O 以便我可以从不同的应用程序同时运行多个作业?

【问题讨论】:

    标签: python h2o


    【解决方案1】:

    如果您想通过 CLI 启动具有 3 个独立节点的 H2O,则为它们指定不同的名称:

    -name H2O_CLUSTER_NAME_1

    -name H2O_CLUSTER_NAME_2

    -name H2O_CLUSTER_NAME_3

    如果您尝试为主题赋予相同的名称,它们将尝试形成一个集群。见here

    【讨论】:

      猜你喜欢
      • 2022-01-09
      • 2018-09-06
      • 1970-01-01
      • 2019-02-24
      • 2013-04-24
      • 2019-07-22
      • 2016-11-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多