H2O-3机器学习平台源码编译的各种坑

H2O-3机器学习平台是一个非常适合非专业人士学习机器学习的平台,自带WebUI,效果还是蛮不错的,官方也提供了jar包,一条命令就能直接运行,非常方便,但最近有源码编译的需求,实际操作过程中,发现,想要编译它的源码,真的比登天还难!

主要是因为,github的源码可以说是日更,成百上千的分支看的人眼花缭乱,而且编译说明文档是世纪更,可当前主线的代码完全对不上。

照着它的编译说明文档操作,绝对掉坑里爬不出来。在此记录一下我的具体编译流程:

一、虚拟机部署Centos7系统

下载Centos7镜像文件,使用版本“CentOS-7-x86_64-DVD-2009”,下载地址:https://mirrors.aliyun.com/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-2009.iso

虚拟机安装centos7过程不在叙述,可参考:

VMware ESXI centos7虚机搭建详解(避坑必看)_esxi安装iso虚机-CSDN博客

虚拟机安装Centos7系统实操教程 详尽步骤 vmware ESXi亲测通过 - 运维全实践 - 博客园 (cnblogs.com)注意安装过程中,软件选择“基础设施服务器”

二、部署H2O-3环境

官方使用了jdk-7u79版本,编译会出现“PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target”错误,所以弃用。

完整环境部署代码如下:

cd /opt
sudo wget https://packages.baidu.com/app/jdk-8/jdk-8u121-linux-x64.tar.gz

sudo tar xzf jdk-8u121-linux-x64.tar.gz
cd jdk-8u121-linux-x64

sudo alternatives --install /usr/bin/java java /opt/jdk1.8.0_121/bin/java 2
sudo alternatives --install /usr/bin/jar jar /opt/jdk1.8.0_121/bin/jar 2
sudo alternatives --install /usr/bin/javac javac /opt/jdk1.8.0_121/bin/javac 2
sudo alternatives --set jar /opt/jdk1.8.0_121/bin/jar
sudo alternatives --set javac /opt/jdk1.8.0_121/bin/javac

cd /opt

sudo wget https://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/e/epel-release-7-14.noarch.rpm
sudo rpm -ivh epel-release-7-14.noarch.rpm

sudo echo "multilib_policy=best" >> /etc/yum.conf
sudo yum -y update

sudo yum -y install R R-devel git python-pip openssl-devel libxml2-devel libcurl-devel gcc gcc-c++ make openssl-devel kernel-devel texlive texinfo texlive-latex-fonts libX11-devel mesa-libGL-devel mesa-libGL nodejs npm python-devel numpy scipy python-pandas


yum install python3-pip
pip3 install --upgrade pip
pip3 install scikit-learn grip tabulate statsmodels wheel

mkdir ~/Rlibrary
export JAVA_HOME=/opt/jdk1.8.0_121
export JRE_HOME=/opt/jdk1.8.0_121/jre
export PATH=$PATH:/opt/jdk1.8.0_121/bin:/opt/jdk1.8.0_121/jre/bin
export R_LIBS_USER=~/Rlibrary

# install local R packages
R -e 'install.packages(c("RCurl","jsonlite","statmod","devtools","roxygen2","testthat"), dependencies=TRUE, repos="http://cran.rstudio.com/")'

cd
git clone https://github.com/h2oai/h2o-3.git
cd h2o-3

注意: h2oai的代码更新频率非常高,基于我编译时的版本拉了一个fork,如果你从官方拉的源代码编译时有问题,可以用我当前使用的代码:

git clone https://github.com/mogu1990/h2o-3.git

三、修改H2O-3代码

第一处:h2o-3/h2o-r/scripts/package_version_check_update.R

将文件末尾的代码:

dcf.file <- seek.files(c("h2o-3-DESCRIPTION.template","h2o-3-DESCRIPTION"))

repos <- c(repos.dcf(dcf.file), "http://s3.amazonaws.com/h2o-r/cran-dev")
pkgs <- packages.dcf(dcf.file, which = "all")

# try on windows/macosx
ans <- pkgs_check_update(pkgs, check_only=check_only, repos=repos) #, force_install="data.table") # allows to be fully up to date

if (!interactive()) {
  expect TRUE
  status <- if (isTRUE(ans)) 0 else 1
  q("no", status=0)
}

修改为:

#dcf.file <- seek.files(c("h2o-3-DESCRIPTION.template","h2o-3-DESCRIPTION"))

#repos <- c(repos.dcf(dcf.file), "http://s3.amazonaws.com/h2o-r/cran-dev")
#pkgs <- packages.dcf(dcf.file, which = "all")

# try on windows/macosx
#ans <- pkgs_check_update(pkgs, check_only=check_only, repos=repos) #, force_install="data.table") # allows to be fully up to date

if (!interactive()) {
  # expect TRUE
  #status <- if (isTRUE(ans)) 0 else 1
  q("no", status=0)
}

目的就是关闭它的R包更新检测,因为代码里请求的“http://s3.amazonaws.com/h2o-r/cran-dev”压根就打不开!!!让人震惊。

第二处:h2o-3/h2o-bindings/build.gradle

将第13、14行代码:

pythonexe = findProperty("pythonExec") ?: "python"
pipexe = findProperty("pipExec") ?: "pip"

改为:

pythonexe = findProperty("pythonExec") ?: "python3"
pipexe = findProperty("pipExec") ?: "pip3"

这是因为,它最开始用的python2.7版本,但现在python2.7已经不支持更新,很多包用不成,所以要换成python3和pip3。

第三处:h2o-3/h2o-py/build.gradle

和第二处同理,第11、12行,改成

pythonexe = findProperty("pythonExec") ?: "python3"
pipexe = findProperty("pipExec") ?: "pip3"

第四处:h2o-3/h2o-py-cloud-extensions/build.gradle

和第二处同理,第9、10行,改成

pythonexe = findProperty("pythonExec") ?: "python3"
pipexe = findProperty("pipExec") ?: "pip3"

第五处:h2o-3-master/h2o-py-mlflow-flavor/build.gradle

和第二处同理,第9、10行,改成

pythonexe = findProperty("pythonExec") ?: "python3"
pipexe = findProperty("pipExec") ?: "pip3"

第二处到第五处的修改实际上都是把python换成python3,pip换成pip3,有个取巧的办法,就是把python的软链接指向python3,pip的软链接指向pip3,就免的修改第2-第5处。

三、开始编译

官方文档说要执行:

./gradlew syncSmalldata
./gradlew syncRPackages --info
./gradlew build -x test --info

实际发现,./gradlew syncSmalldata不用执行,因为它是下载了一堆的csv文件用来测试的,下载的具慢,不要执行。所以我们应该这么执行:

./gradlew syncRPackages --info

先执行R包的同步更新,如果不修改第一处,这里绝对报错,执行成功后再执行:

./gradlew build -x test --info

这里千万要把-x test加上,如果不加,默认就要进行测试校验,问题一大堆,绝对编译失败。

编译成功后,bulid目录下会生成h2o.jar文件。使用命令

java -jar h2o.jar

即可启动服务,不报错的情况下,浏览器访问http://ip:54321即可打开web界面。

为啥访问不到?记着关闭centos7的防火墙!

  • 11
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值