{"id":13407691,"url":"https://github.com/maxpumperla/elephas","last_synced_at":"2025-10-09T18:38:44.027Z","repository":{"id":36352035,"uuid":"40656806","full_name":"maxpumperla/elephas","owner":"maxpumperla","description":"Distributed Deep learning with Keras \u0026 Spark","archived":false,"fork":false,"pushed_at":"2023-05-01T20:46:16.000Z","size":2682,"stargazers_count":1574,"open_issues_count":9,"forks_count":311,"subscribers_count":99,"default_branch":"master","last_synced_at":"2025-05-15T16:08:50.934Z","etag":null,"topics":["deep-learning","distributed-computing","keras","neural-networks","spark"],"latest_commit_sha":null,"homepage":"http://maxpumperla.com/elephas/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/maxpumperla.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null},"funding":{"github":["maxpumperla"],"patreon":null,"open_collective":null,"ko_fi":null,"tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"otechie":null,"custom":null}},"created_at":"2015-08-13T12:09:19.000Z","updated_at":"2025-04-19T01:24:37.000Z","dependencies_parsed_at":"2023-01-17T00:43:25.366Z","dependency_job_id":"a731c71e-7629-49d1-86b4-aba412a7b201","html_url":"https://github.com/maxpumperla/elephas","commit_stats":{"total_commits":455,"total_committers":29,"mean_commits":"15.689655172413794","dds":0.4527472527472527,"last_synced_commit":"48f6f469a0a898533946639c095a31c1db81c50b"},"previous_names":[],"tags_count":16,"template":false,"template_full_name":null,"purl":"pkg:github/maxpumperla/elephas","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maxpumperla%2Felephas","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maxpumperla%2Felephas/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maxpumperla%2Felephas/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maxpumperla%2Felephas/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/maxpumperla","download_url":"https://codeload.github.com/maxpumperla/elephas/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maxpumperla%2Felephas/sbom","scorecard":{"id":629915,"data":{"date":"2025-08-11","repo":{"name":"github.com/maxpumperla/elephas","commit":"48f6f469a0a898533946639c095a31c1db81c50b"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":1.6,"checks":[{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Code-Review","score":0,"reason":"Found 1/17 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: containerImage not pinned by hash: Dockerfile:3","Warn: pipCommand not pinned by hash: Dockerfile:40-58","Warn: pipCommand not pinned by hash: Dockerfile:40-58","Warn: pipCommand not pinned by hash: Dockerfile:67","Warn: pipCommand not pinned by hash: Dockerfile:68","Info:   0 out of   1 containerImage dependencies pinned","Info:   0 out of   4 pipCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Vulnerabilities","score":0,"reason":"10 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: PYSEC-2023-62 / GHSA-m2qf-hxjv-5gpq","Warn: Project is vulnerable to: PYSEC-2023-44 / GHSA-329j-jfvr-rhr6","Warn: Project is vulnerable to: PYSEC-2022-42976 / GHSA-43xg-8wmj-cw8h","Warn: Project is vulnerable to: PYSEC-2022-236 / GHSA-4x9r-j582-cgr8","Warn: Project is vulnerable to: PYSEC-2018-25 / GHSA-6mqq-8r44-vmjc","Warn: Project is vulnerable to: PYSEC-2017-147 / GHSA-8rhc-48pp-52gr","Warn: Project is vulnerable to: PYSEC-2022-186 / GHSA-9rr6-jpg7-9jg6","Warn: Project is vulnerable to: PYSEC-2019-114 / GHSA-fp5j-3fpf-mhj5","Warn: Project is vulnerable to: PYSEC-2020-95 / GHSA-wgx7-jwwm-cgjv","Warn: Project is vulnerable to: PYSEC-2023-72"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 16 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-21T07:34:58.465Z","repository_id":36352035,"created_at":"2025-08-21T07:34:58.465Z","updated_at":"2025-08-21T07:34:58.465Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279001894,"owners_count":26083226,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-09T02:00:07.460Z","response_time":59,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["deep-learning","distributed-computing","keras","neural-networks","spark"],"created_at":"2024-07-30T20:00:47.335Z","updated_at":"2025-10-09T18:38:43.997Z","avatar_url":"https://github.com/maxpumperla.png","language":"Python","readme":"\u003cspan style=\"color:red\"\u003e**UPDATE**: As of 3.2.0, maintenance of this project has moved over to https://github.com/danielenricocahall/elephas for consistency of ownership and CI. Please submit all Issues and Pull Requests there!\u003c/span\u003e\n\n# Elephas: Distributed Deep Learning with Keras \u0026 Spark \n\n![Elephas](https://github.com/maxpumperla/elephas/blob/master/elephas-logo.png)\n\n## \n\n[![Build Status](https://travis-ci.com/maxpumperla/elephas.svg?branch=master)](https://travis-ci.com/maxpumperla/elephas)\n[![license](https://img.shields.io/github/license/mashape/apistatus.svg?maxAge=2592000)](https://github.com/maxpumperla/elephas/blob/master/LICENSE)\n\nElephas is an extension of [Keras](http://keras.io), which allows you to run distributed deep learning models at \nscale with [Spark](http://spark.apache.org). Elephas currently supports a number of \napplications, including:\n\n- [Data-parallel training of deep learning models](#basic-spark-integration)\n- [Distributed training of ensemble models](#distributed-training-of-ensemble-models)\n- [~~Distributed hyper-parameter optimization~~](#distributed-hyper-parameter-optimization)  (removed as of 3.0.0)\n\n\n\nSchematically, elephas works as follows.\n\n![Elephas](https://github.com/maxpumperla/elephas/blob/master/elephas.gif)\n\nTable of content:\n* [Elephas: Distributed Deep Learning with Keras \u0026 Spark](#elephas-distributed-deep-learning-with-keras-\u0026-spark-)\n  * [Introduction](#introduction)\n  * [Getting started](#getting-started)\n  * [Basic Spark integration](#basic-spark-integration)\n  * [Spark MLlib integration](#spark-mllib-integration)\n  * [Spark ML integration](#spark-ml-integration)\n  * [Distributed hyper-parameter optimization](#distributed-hyper-parameter-optimization)\n  * [Distributed training of ensemble models](#distributed-training-of-ensemble-models)\n  * [Discussion](#discussion)\n  * [Literature](#literature)\n\n\n\n## Introduction\nElephas brings deep learning with [Keras](http://keras.io) to [Spark](http://spark.apache.org). Elephas intends to \nkeep the simplicity and high usability of Keras, thereby allowing for fast prototyping of distributed models, which \ncan be run on massive data sets. For an introductory example, see the following \n[iPython notebook](https://github.com/maxpumperla/elephas/blob/master/examples/Spark_ML_Pipeline.ipynb).\n\nἐλέφας is Greek for _ivory_ and an accompanying project to κέρας, meaning _horn_. If this seems weird mentioning, like \na bad dream, you should confirm it actually is at the \n[Keras documentation](https://github.com/fchollet/keras/blob/master/README.md). \nElephas also means _elephant_, as in stuffed yellow elephant.\n\nElephas implements a class of data-parallel algorithms on top of Keras, using Spark's RDDs and data frames. \nKeras Models are initialized on the driver, then serialized and shipped to workers, alongside with data and broadcasted \nmodel parameters. Spark workers deserialize the model, train their chunk of data and send their gradients back to the \ndriver. The \"master\" model on the driver is updated by an optimizer, which takes gradients either synchronously or\nasynchronously.\n\n## Getting started\n\nJust install elephas from PyPI with, Spark will be installed through `pyspark` for you.\n\n```\npip install elephas\n```\n\nThat's it, you should now be able to run Elephas examples.\n\n## Basic Spark integration\n\nAfter installing both Elephas, you can train a model as follows. First, create a local pyspark context\n```python\nfrom pyspark import SparkContext, SparkConf\nconf = SparkConf().setAppName('Elephas_App').setMaster('local[8]')\nsc = SparkContext(conf=conf)\n```\n\nNext, you define and compile a Keras model\n```python\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras.layers import Dense, Dropout, Activation\nfrom tensorflow.keras.optimizers import SGD\nmodel = Sequential()\nmodel.add(Dense(128, input_dim=784))\nmodel.add(Activation('relu'))\nmodel.add(Dropout(0.2))\nmodel.add(Dense(128))\nmodel.add(Activation('relu'))\nmodel.add(Dropout(0.2))\nmodel.add(Dense(10))\nmodel.add(Activation('softmax'))\nmodel.compile(loss='categorical_crossentropy', optimizer=SGD())\n```\n\nand create an RDD from numpy arrays (or however you want to create an RDD)\n```python\nfrom elephas.utils.rdd_utils import to_simple_rdd\nrdd = to_simple_rdd(sc, x_train, y_train)\n```\n\nThe basic model in Elephas is the `SparkModel`. You initialize a `SparkModel` by passing in a compiled Keras model, \nan update frequency and a parallelization mode. After that you can simply `fit` the model on your RDD. Elephas `fit`\nhas the same options as a Keras model, so you can pass `epochs`, `batch_size` etc. as you're used to from tensorflow.keras.\n\n```python\nfrom elephas.spark_model import SparkModel\n\nspark_model = SparkModel(model, frequency='epoch', mode='asynchronous')\nspark_model.fit(rdd, epochs=20, batch_size=32, verbose=0, validation_split=0.1)\n```\n\nYour script can now be run using spark-submit\n```bash\nspark-submit --driver-memory 1G ./your_script.py\n```\n\nIncreasing the driver memory even further may be necessary, as the set of parameters in a network may be very large \nand collecting them on the driver eats up a lot of resources. See the examples folder for a few working examples.\n\n## Distributed Inference / Evaluation\n\nThe `SparkModel` can also be used for distributed inference (prediction) and evaluation. Similar to the `fit` method,  the `predict` and `evaluate` methods\nconform to the Keras Model API. \n\n```python\nfrom elephas.spark_model import SparkModel\n\n# create/train the model, similar to the previous section (Basic Spark Integration)\nmodel = ...\nspark_model = SparkModel(model, ...)\nspark_model.fit(...)\n\nx_test, y_test = ... # load test data\n\npredictions = spark_model.predict(x_test) # perform inference\nevaluation = spark_model.evaluate(x_test, y_test) # perform evaluation/scoring\n```\nThe paradigm is identical to the data parallelism in training, as the model is serialized and shipped to the workers and used to evaluate a chunk of the testing data. The predict method will take either a numpy array or an RDD.\n\n## Spark MLlib integration\n\nFollowing up on the last example, to use Spark's MLlib library with Elephas, you create an RDD of LabeledPoints for \nsupervised training as follows\n\n```python\nfrom elephas.utils.rdd_utils import to_labeled_point\nlp_rdd = to_labeled_point(sc, x_train, y_train, categorical=True)\n```\n\nTraining a given LabeledPoint-RDD is very similar to what we've seen already\n\n```python\nfrom elephas.spark_model import SparkMLlibModel\nspark_model = SparkMLlibModel(model, frequency='batch', mode='hogwild')\nspark_model.train(lp_rdd, epochs=20, batch_size=32, verbose=0, validation_split=0.1, \n                  categorical=True, nb_classes=nb_classes)\n```\n\n\n## Spark ML integration\n\nTo train a model with a SparkML estimator on a data frame, use the following syntax.\n```python\ndf = to_data_frame(sc, x_train, y_train, categorical=True)\ntest_df = to_data_frame(sc, x_test, y_test, categorical=True)\n\nestimator = ElephasEstimator(model, epochs=epochs, batch_size=batch_size, frequency='batch', mode='asynchronous',\n                             categorical=True, nb_classes=nb_classes)\nfitted_model = estimator.fit(df)\n```\n\nFitting an estimator results in a SparkML transformer, which we can use for predictions and other evaluations by \ncalling the transform method on it.\n\n```python\nprediction = fitted_model.transform(test_df)\npnl = prediction.select(\"label\", \"prediction\")\npnl.show(100)\n\nprediction_and_label= pnl.rdd.map(lambda row: (row.label, row.prediction))\nmetrics = MulticlassMetrics(prediction_and_label)\nprint(metrics.precision())\nprint(metrics.recall())\n```\n\nIf the model utilizes custom activation function, layer, or loss function, that will need to be supplied using the `set_custom_objects` method:\n\n```python\ndef custom_activation(x):\n    ...\nclass CustomLayer(Layer):\n    ...\nmodel = Sequential()\nmodel.add(CustomLayer(...))\n\nestimator = ElephasEstimator(model, epochs=epochs, batch_size=batch_size)\nestimator.set_custom_objects({'custom_activation': custom_activation, 'CustomLayer': CustomLayer})\n```\n\n## Distributed hyper-parameter optimization\n\n\u003cspan style=\"color:red\"\u003e**UPDATE**: As of 3.0.0, Hyper-parameter optimization features have been removed, since Hyperas is no longer active and was causing versioning compatibility issues. To use these features, install version 2.1 or below.\u003c/span\u003e\n\nHyper-parameter optimization with elephas is based on [hyperas](https://github.com/maxpumperla/hyperas), a convenience \nwrapper for hyperopt and keras. Each Spark worker executes a number of trials, the results get collected and the best \nmodel is returned. As the distributed mode in hyperopt (using MongoDB), is somewhat difficult to configure and error \nprone at the time of writing, we chose to implement parallelization ourselves. Right now, the only available \noptimization algorithm is random search.\n\nThe first part of this example is more or less directly taken from the hyperas documentation. We define data and model \nas functions, hyper-parameter ranges are defined through braces. See the hyperas documentation for more on how \nthis works.\n\n```python\nfrom hyperopt import STATUS_OK\nfrom hyperas.distributions import choice, uniform\n\ndef data():\n    from tensorflow.keras.datasets import mnist\n    from tensorflow.keras.utils import to_categorical\n    (x_train, y_train), (x_test, y_test) = mnist.load_data()\n    x_train = x_train.reshape(60000, 784)\n    x_test = x_test.reshape(10000, 784)\n    x_train = x_train.astype('float32')\n    x_test = x_test.astype('float32')\n    x_train /= 255\n    x_test /= 255\n    nb_classes = 10\n    y_train = to_categorical(y_train, nb_classes)\n    y_test = to_categorical(y_test, nb_classes)\n    return x_train, y_train, x_test, y_test\n\n\ndef model(x_train, y_train, x_test, y_test):\n    from tensorflow.keras.models import Sequential\n    from tensorflow.keras.layers import Dense, Dropout, Activation\n    from tensorflow.keras.optimizers import RMSprop\n\n    model = Sequential()\n    model.add(Dense(512, input_shape=(784,)))\n    model.add(Activation('relu'))\n    model.add(Dropout({{uniform(0, 1)}}))\n    model.add(Dense({{choice([256, 512, 1024])}}))\n    model.add(Activation('relu'))\n    model.add(Dropout({{uniform(0, 1)}}))\n    model.add(Dense(10))\n    model.add(Activation('softmax'))\n\n    rms = RMSprop()\n    model.compile(loss='categorical_crossentropy', optimizer=rms)\n\n    model.fit(x_train, y_train,\n              batch_size={{choice([64, 128])}},\n              nb_epoch=1,\n              show_accuracy=True,\n              verbose=2,\n              validation_data=(x_test, y_test))\n    score, acc = model.evaluate(x_test, y_test, show_accuracy=True, verbose=0)\n    print('Test accuracy:', acc)\n    return {'loss': -acc, 'status': STATUS_OK, 'model': model.to_json()}\n```\n\nOnce the basic setup is defined, running the minimization is done in just a few lines of code:\n\n```python\nfrom elephas.hyperparam import HyperParamModel\nfrom pyspark import SparkContext, SparkConf\n\n# Create Spark context\nconf = SparkConf().setAppName('Elephas_Hyperparameter_Optimization').setMaster('local[8]')\nsc = SparkContext(conf=conf)\n\n# Define hyper-parameter model and run optimization\nhyperparam_model = HyperParamModel(sc)\nhyperparam_model.minimize(model=model, data=data, max_evals=5)\n```\n\n## Distributed training of ensemble models\n\nBuilding on the last section, it is possible to train ensemble models with elephas by means of running hyper-parameter \noptimization on large search spaces and defining a resulting voting classifier on the top-n performing models. \nWith ```data``` and ```model``` defined as above, this is a simple as running\n\n```python\nresult = hyperparam_model.best_ensemble(nb_ensemble_models=10, model=model, data=data, max_evals=5)\n```\nIn this example an ensemble of 10 models is built, based on optimization of at most 5 runs on each of the Spark workers.\n\n## Discussion\n\nPremature parallelization may not be the root of all evil, but it may not always be the best idea to do so. Keep in \nmind that more workers mean less data per worker and parallelizing a model is not an excuse for actual learning. \nSo, if you can perfectly well fit your data into memory *and* you're happy with training speed of the model consider \njust using keras.\n\nOne exception to this rule may be that you're already working within the Spark ecosystem and want to leverage what's \nthere. The above SparkML example shows how to use evaluation modules from Spark and maybe you wish to further process \nthe outcome of an elephas model down the road. In this case, we recommend to use elephas as a simple wrapper by setting \nnum_workers=1.\n\nNote that right now elephas restricts itself to data-parallel algorithms for two reasons. First, Spark simply makes it \nvery easy to distribute data. Second, neither Spark nor Theano make it particularly easy to split up the actual model \nin parts, thus making model-parallelism practically impossible to realize.\n\nHaving said all that, we hope you learn to appreciate elephas as a pretty easy to setup and use playground for \ndata-parallel deep-learning algorithms.\n\n\n## Literature\n[1] J. Dean, G.S. Corrado, R. Monga, K. Chen, M. Devin, QV. Le, MZ. Mao, M’A. Ranzato, A. Senior, P. Tucker, K. Yang, and AY. Ng. [Large Scale Distributed Deep Networks](http://research.google.com/archive/large_deep_networks_nips2012.html).\n\n[2] F. Niu, B. Recht, C. Re, S.J. Wright [HOGWILD!: A Lock-Free Approach to Parallelizing Stochastic Gradient Descent](http://arxiv.org/abs/1106.5730)\n\n[3] C. Noel, S. Osindero. [Dogwild! — Distributed Hogwild for CPU \u0026 GPU](http://stanford.edu/~rezab/nips2014workshop/submits/dogwild.pdf)\n\n## Maintainers / Contributions\n\nThis great project was started by Max Pumperla, and is currently maintained by Daniel Cahall (https://github.com/danielenricocahall). If you have any questions, please feel free to open up an issue or send an email to danielenricocahall@gmail.com. If you want to contribute, feel free to submit a PR, or start a conversation about how we can go about implementing something.\n","funding_links":["https://github.com/sponsors/maxpumperla"],"categories":["The Data Science Toolbox","Uncategorized","Deep Learning","Frameworks","Deep Learning Framework","Python","分布式机器学习","Tensor Flow"],"sub_categories":["Deep Learning Packages","Uncategorized","TensorFlow","**[Contributing](#contributing)** --\u003e","Deployment \u0026 Distribution","Automated Machine Learning"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmaxpumperla%2Felephas","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmaxpumperla%2Felephas","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmaxpumperla%2Felephas/lists"}