extend ../_components/base.pug

block pagetitle
    title Continuous Machine Learning, Scalable Deep Learning - Apache Ignite
    meta(name="description", content="Apache Ignite Machine Learning is a set of simple and efficient APIs to enable continuous learning. It relies on Ignite's multi-tier storage that bring massive scalability for machine learning and deep learning tasks.")
    link(rel="canonical", href="https://ignite.apache.org/features/machinelearning.html")

    meta(property="og:title", content="Continuous Machine Learning, Scalable Deep Learning - Apache Ignite")
    meta(property="og:type", content="article")
    meta(property="og:url", content="https://ignite.apache.org/features/machinelearning.html")
    meta(property="og:image", content="/img/og-pic.png")
    meta(property="og:description", content="Apache Ignite Machine Learning is a set of simple and efficient APIs to enable continuous learning. It relies on Ignite's multi-tier storage that bring massive scalability for machine learning and deep learning tasks.")

block css 
    link(rel="stylesheet", href="../css/native-persistence.css?ver=" + config.version)
    link(rel="stylesheet", href="../css/compute-apis.css?ver=" + config.version)
    link(rel="stylesheet", href="../css/machinelearning.css?ver=" + config.version)

  



block main
    - global.pageHref = "features"
    - config.hdrClassName = "hdr__blue"
    include ../_components/header.pug


    section.innerhero
        .container.innerhero__cont
            .innerhero__main
                .innerhero__pre.pb-3 Apache Ignite
                h1.h1.innerhero__h1 Machine Learning<br> APIs
                .innerhero__descr.pt-2.h5.
                    Continuously train, execute and update your machine learning<br> models at scale and in real time
                .innerhero__action 
                    a.button.innerhero__button(href="https://ignite.apache.org/docs/latest/index") Start Coding
            img.innerhero__pic.innerhero__pic--machine(src="/img/features/machinelearning/machine.svg", alt="Machine-hero")
    // /.innerhero

  

    section.machine1
      .container
         .machine1__block.flexi
              .machine1__info
                h2.compute2__h2 Ignite Machine Learning APIs Overview
                p.machine1__text.pt-5 Ignite Machine Learning (ML) is a set of simple, scalable, and efficient tools that allow building predictive machine learning models without costly data transfers.
                h3.machine1__title.machine-top How does Apache Ignite support ML APIs?
                p.machine1__text You have two options:
                .machine1__options.flexi
                  .machine1__option
                    .machine1__number 01
                    .machine1__subtext Use built-in ML APIs for some of the typical ML and deep learning (DL) tasks, such as:
                    .machine1__subtext.flexi
                      span — Classification
                      span — Regression
                      span  — Clustering
                      span — Recommendation
                      span — Preprocessing
                  .machine1__option 
                    .machine1__number 02
                    .machine1__subtext Use external ML and DL libraries that use Apache Ignite as scalable and high-performance distributed data storage:
                    .machine1__subtext.flexi
                      span — TensorFlow
                      span — Scikit
                      span — Spark
                      span — And more
                    
                   
              img.machine1__image(src="/img/features/machinelearning/image.svg", alt="image") 
     

    section.compute2
     .container
       h2.compute2__h2 Benefits of Apache Ignite Machine Learning APIs
       .machineitem.machineitem1.flexi
          h3.machine__title Expedite the training process <br>with horizontally scalable cluster
          .machine__info
            p.machine__text You can distribute your training data set over an unlimited number of cluster nodes and train your models with the speed of memory.<br> With built-in Ignite ML APIs, you:
            .machine__part.flexi
              .compute2-points__item.fz20
              .machine__subtext Avoid, or minimise ETL
            .machine__part.flexi
              .compute2-points__item.fz20
              .machine__subtext Load all your training data sets in the same cluster
            .machine__part.flexi
              .compute2-points__item.fz20
              .machine__subtext Minimise network utilization during the training process
       .machineitem.machineitem1.flexi
          h3.machine__title Execute your ML models with in-memory speed from your application code
          .machine__info
            p.machine__text Once the model is trained, deploy it on the cluster and execute it with in-memory speed. Use built-in Ignite APIs or 3rd party libraries.
       .machineitem.machineitem1.flexi
          h3.machine__title Continue updating your models with new data in real time
          .machine__info
            p.machine__text Data and user behavior change rapidly, so you must constantly update your models. With Apache Ignite, you can update your already deployed ML models with new data sets.

            
    // /.compute2

    section.native-bottom.container
        .native-bottom__grid 
            article.nativebotblock
                .h4.nativebotblock__title
                    img(src="/img/features/native-rocket.svg", alt="").nativebotblock__icon
                    span Ready to Start?
                p.nativebotblock__text Start coding machine learning APIs
                a.nativebotblock__link.arrowlink(href="https://ignite.apache.org/docs/latest/machine-learning/machine-learning", target="_blank") Performing Machine Learning
            article.nativebotblock.nativebotblock--learn
                .h4.nativebotblock__title
                    img(src="/img/features/native-docs.svg", alt="").nativebotblock__icon
                    span Want to Learn More?
                p.nativebotblock__text Check out how Apache Ignite updates<br> trained models in real time
                a.nativebotblock__link.arrowlink(href="https://ignite.apache.org/docs/latest/machine-learning/updating-trained-models", target="_blank") Updating Trained Models




