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

2024-04-13 11:12

本文主要是介绍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.gzsudo tar xzf jdk-8u121-linux-x64.tar.gz
cd jdk-8u121-linux-x64sudo 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/javaccd /optsudo 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.rpmsudo echo "multilib_policy=best" >> /etc/yum.conf
sudo yum -y updatesudo 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-pandasyum install python3-pip
pip3 install --upgrade pip
pip3 install scikit-learn grip tabulate statsmodels wheelmkdir ~/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 dateif (!interactive()) {expect TRUEstatus <- if (isTRUE(ans)) 0 else 1q("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 dateif (!interactive()) {# expect TRUE#status <- if (isTRUE(ans)) 0 else 1q("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的防火墙!

这篇关于H2O-3机器学习平台源码编译的各种坑的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

在Android平台上实现消息推送功能

《在Android平台上实现消息推送功能》随着移动互联网应用的飞速发展,消息推送已成为移动应用中不可或缺的功能,在Android平台上,实现消息推送涉及到服务端的消息发送、客户端的消息接收、通知渠道(... 目录一、项目概述二、相关知识介绍2.1 消息推送的基本原理2.2 Firebase Cloud Me

idea maven编译报错Java heap space的解决方法

《ideamaven编译报错Javaheapspace的解决方法》这篇文章主要为大家详细介绍了ideamaven编译报错Javaheapspace的相关解决方法,文中的示例代码讲解详细,感兴趣的... 目录1.增加 Maven 编译的堆内存2. 增加 IntelliJ IDEA 的堆内存3. 优化 Mave

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

Python实现无痛修改第三方库源码的方法详解

《Python实现无痛修改第三方库源码的方法详解》很多时候,我们下载的第三方库是不会有需求不满足的情况,但也有极少的情况,第三方库没有兼顾到需求,本文将介绍几个修改源码的操作,大家可以根据需求进行选择... 目录需求不符合模拟示例 1. 修改源文件2. 继承修改3. 猴子补丁4. 追踪局部变量需求不符合很

Spring 中 BeanFactoryPostProcessor 的作用和示例源码分析

《Spring中BeanFactoryPostProcessor的作用和示例源码分析》Spring的BeanFactoryPostProcessor是容器初始化的扩展接口,允许在Bean实例化前... 目录一、概览1. 核心定位2. 核心功能详解3. 关键特性二、Spring 内置的 BeanFactory

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题

《解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题》文章详细描述了在使用lombok的@Data注解标注实体类时遇到编译无误但运行时报错的问题,分析... 目录问题分析问题解决方案步骤一步骤二步骤三总结问题使用lombok注解@Data标注实体类,编译时