From 50983ee91f78bb024e78769ff2d2fa50a9c066e3 Mon Sep 17 00:00:00 2001 From: Kate Unger <32380357+KateUnger@users.noreply.github.com> Date: Sat, 1 Jul 2023 00:02:41 -0700 Subject: [PATCH] Update website appearance (#8) * Restructure organization * move theme README and create proj README * fix Proj README * remove unused screens * add possible banner * save * add logo and banner * add svgs * new logo --- README.md | 281 +------------------ _config.yml | 4 +- _data/navigation.yml | 10 +- _includes/head/custom.html | 10 + _pages/about.md | 25 -- _pages/gnn.md | 22 -- _pages/keras.md | 46 ---- _pages/search.md | 93 ------- _pages/specInfer.md | 3 +- _pages/start.md | 142 ---------- _sass/minimal-mistakes/_page.scss | 16 +- _sass/minimal-mistakes/skins/_contrast.scss | 2 +- android-chrome-144x144.png | Bin 0 -> 3686 bytes apple-touch-icon.png | Bin 0 -> 4487 bytes assets/images/Banner.png | Bin 0 -> 65572 bytes assets/images/banner.svg | 282 ++++++++++++++++++++ assets/images/logo.png | Bin 0 -> 3524 bytes assets/images/logo.svg | 255 ++++++++++++++++++ browserconfig.xml | 9 + docs/README.md | 273 +++++++++++++++++++ favicon-16x16.png | Bin 0 -> 1038 bytes favicon-32x32.png | Bin 0 -> 1700 bytes favicon.ico | Bin 0 -> 15086 bytes index.md | 32 ++- mstile-150x150.png | Bin 0 -> 3700 bytes safari-pinned-tab.svg | 29 ++ site.webmanifest | 14 + 27 files changed, 928 insertions(+), 620 deletions(-) delete mode 100644 _pages/about.md delete mode 100644 _pages/gnn.md delete mode 100644 _pages/keras.md delete mode 100644 _pages/search.md delete mode 100644 _pages/start.md create mode 100644 android-chrome-144x144.png create mode 100644 apple-touch-icon.png create mode 100644 assets/images/Banner.png create mode 100644 assets/images/banner.svg create mode 100644 assets/images/logo.png create mode 100644 assets/images/logo.svg create mode 100644 browserconfig.xml create mode 100644 docs/README.md create mode 100644 favicon-16x16.png create mode 100644 favicon-32x32.png create mode 100644 favicon.ico create mode 100644 mstile-150x150.png create mode 100644 safari-pinned-tab.svg create mode 100644 site.webmanifest diff --git a/README.md b/README.md index 2757638c..5527dda2 100644 --- a/README.md +++ b/README.md @@ -1,273 +1,16 @@ -# [Minimal Mistakes Jekyll theme](https://mmistakes.github.io/minimal-mistakes/) +# FlexFlow Website +[Go to Website](https://flexflow.ai/) +Uses **MinimalMistakes** - a flexible two-column Jekyll theme, perfect for building personal sites, blogs, and portfolios. You can see documentation for **MinimalMistakes** in the `docs` [directory](https://github.com/flexflow/website/tree/master/docs). -[![LICENSE](https://img.shields.io/badge/license-MIT-lightgrey.svg)](https://raw.githubusercontent.com/mmistakes/minimal-mistakes/master/LICENSE) -[![Jekyll](https://img.shields.io/badge/jekyll-%3E%3D%203.7-blue.svg)](https://jekyllrb.com/) -[![Ruby gem](https://img.shields.io/gem/v/minimal-mistakes-jekyll.svg)](https://rubygems.org/gems/minimal-mistakes-jekyll) -[![Tip Me via PayPal](https://img.shields.io/badge/PayPal-tip%20me-green.svg?logo=paypal)](https://www.paypal.me/mmistakes) +## Run Project Locally +1. Clone Project +2. Install dependencies with ```gem install bundler jekyll``` +3. Run project with ```bundle exec jekyll serve``` +4. View local instance in browser at [http://localhost:4000](http://localhost:4000) -Minimal Mistakes is a flexible two-column Jekyll theme, perfect for building personal sites, blogs, and portfolios. As the name implies, styling is purposely minimalistic to be enhanced and customized by you :smile:. -:sparkles: See what's new in the [CHANGELOG](CHANGELOG.md). +## Project Organization +* `index.md`: Home page for application; Includes a header and then short About section +* `navigation.yml`: Configures main navigation bar (top of website) (e.g. `Get Started`, `Documentation`, `Github`, `Resources`). +* `_pages`: Includes all pages in the application (some are currently not in use); Each file begins with a YAML front matter block to configure its settings and is followed by a Markdown section that is the body of the page -**If you enjoy this theme, please consider [supporting me](https://www.paypal.me/mmistakes) to continue developing and maintaining it.** - -[![Support via PayPal](https://cdn.jsdelivr.net/gh/twolfson/paypal-github-button@1.0.0/dist/button.svg)](https://www.paypal.me/mmistakes) - -**Note:** The theme uses the [jekyll-include-cache](https://github.com/benbalter/jekyll-include-cache) plugin which will need to be installed in your `Gemfile` and added to the `plugins` array of `_config.yml`. Otherwise you'll encounter `Unknown tag 'include_cached'` errors at build. - -[![Minimal Mistakes live preview][2]][1] - -[1]: https://mmistakes.github.io/minimal-mistakes/ -[2]: screenshot.png (live preview) - -![layout examples](screenshot-layouts.png) - -## Notable features - -- Bundled as a "theme gem" for easier installation/upgrading. -- Compatible with GitHub Pages. -- Support for Jekyll's built-in Sass/SCSS preprocessor. -- Nine different skins (color variations). -- Several responsive layout options (single, archive index, search, splash, and paginated home page). -- Optimized for search engines with support for [Twitter Cards](https://dev.twitter.com/cards/overview) and [Open Graph](http://ogp.me/) data. -- Optional [header images](https://mmistakes.github.io/minimal-mistakes/docs/layouts/#headers), [custom sidebars](https://mmistakes.github.io/minimal-mistakes/docs/layouts/#sidebars), [table of contents](https://mmistakes.github.io/minimal-mistakes/docs/helpers/#table-of-contents), [galleries](https://mmistakes.github.io/minimal-mistakes/docs/helpers/#gallery), related posts, [breadcrumb links](https://mmistakes.github.io/minimal-mistakes/docs/configuration/#breadcrumb-navigation-beta), [navigation lists](https://mmistakes.github.io/minimal-mistakes/docs/helpers/#navigation-list), and more. -- Commenting support (powered by [Disqus](https://disqus.com/), [Facebook](https://developers.facebook.com/docs/plugins/comments), Google+, [Discourse](https://www.discourse.org/), static-based via [Staticman](https://staticman.net/), and [utterances](https://utteranc.es/)). -- [Google Analytics](https://www.google.com/analytics/) support. -- UI localized text in English (default), Brazilian Portuguese (Português brasileiro), Catalan, Chinese, Danish, Dutch, Finnish, French (Français), German (Deutsch), Greek, Hindi (हिंदी), Hungarian, Indonesian, Irish (Gaeilge), Italian (Italiano), Japanese, Korean, Malayalam, Myanmar (Burmese), Nepali (Nepalese), Persian (فارسی), Polish, Punjabi (ਪੰਜਾਬੀ), Romanian, Russian, Slovak, Spanish (Español), Swedish, Thai, Turkish (Türkçe), and Vietnamese. - -## Skins (color variations) - -This theme comes in nine different skins (in addition to the default one). - -| `air` | `contrast` | `dark` | -| --- | --- | --- | -| [![air skin](https://mmistakes.github.io/minimal-mistakes/assets/images/air-skin-archive.png)](https://mmistakes.github.io/minimal-mistakes/assets/images/air-skin-archive-large.png) | [![contrast skin](https://mmistakes.github.io/minimal-mistakes/assets/images/contrast-skin-archive.png)](https://mmistakes.github.io/minimal-mistakes/assets/images/contrast-skin-archive-large.png) | [![dark skin](https://mmistakes.github.io/minimal-mistakes/assets/images/dark-skin-archive.png)](https://mmistakes.github.io/minimal-mistakes/assets/images/dark-skin-archive-large.png) | - -| `dirt` | `mint` | `sunrise` | -| --- | --- | --- | -| [![dirt skin](https://mmistakes.github.io/minimal-mistakes/assets/images/dirt-skin-archive.png)](https://mmistakes.github.io/minimal-mistakes/assets/images/dirt-skin-archive-large.png) | [![mint skin](https://mmistakes.github.io/minimal-mistakes/assets/images/mint-skin-archive.png)](https://mmistakes.github.io/minimal-mistakes/assets/images/mint-skin-archive-large.png) | [![sunrise skin](https://mmistakes.github.io/minimal-mistakes/assets/images/sunrise-skin-archive.png)](https://mmistakes.github.io/minimal-mistakes/assets/images/sunrise-skin-archive-large.png) | - -| `aqua` | `neon` | `plum` | -| --- | --- | --- | -| [![aqua skin](https://mmistakes.github.io/minimal-mistakes/assets/images/aqua-skin-archive.png)](https://mmistakes.github.io/minimal-mistakes/assets/images/aqua-skin-archive-large.png) | [![neon skin](https://mmistakes.github.io/minimal-mistakes/assets/images/neon-skin-archive.png)](https://mmistakes.github.io/minimal-mistakes/assets/images/neon-skin-archive-large.png) | [![plum skin](https://mmistakes.github.io/minimal-mistakes/assets/images/plum-skin-archive.png)](https://mmistakes.github.io/minimal-mistakes/assets/images/plum-skin-archive-large.png) | - -## Demo pages - -| Name | Description | -| ------------------------------------------- | ----------------------------------------------------- | -| [Post with Header Image][header-image-post] | A post with a large header image. | -| [HTML Tags and Formatting Post][html-tags-post] | A variety of common markup showing how the theme styles them. | -| [Syntax Highlighting Post][syntax-post] | Post displaying highlighted code. | -| [Post with a Gallery][gallery-post] | A post showing several images wrapped in `
` elements. | -| [Sample Collection Page][sample-collection] | Single page from a collection. | -| [Categories Archive][categories-archive] | Posts grouped by category. | -| [Tags Archive][tags-archive] | Posts grouped by tag. | - -Additional sample posts are available under [posts archive][year-archive] on the demo site. Source files for these (and the entire demo site) can be found in [`/docs`](docs). - -[header-image-post]: https://mmistakes.github.io/minimal-mistakes/layout-header-image-text-readability/ -[gallery-post]: https://mmistakes.github.io/minimal-mistakes/post%20formats/post-gallery/ -[html-tags-post]: https://mmistakes.github.io/minimal-mistakes/markup/markup-html-tags-and-formatting/ -[syntax-post]: https://mmistakes.github.io/minimal-mistakes/markup-syntax-highlighting/ -[sample-collection]: https://mmistakes.github.io/minimal-mistakes/recipes/chocolate-chip-cookies/ -[categories-archive]: https://mmistakes.github.io/minimal-mistakes/categories/ -[tags-archive]: https://mmistakes.github.io/minimal-mistakes/tags/ -[year-archive]: https://mmistakes.github.io/minimal-mistakes/year-archive/ - -## Installation - -There are three ways to install: as a [gem-based theme](https://jekyllrb.com/docs/themes/#understanding-gem-based-themes), as a [remote theme](https://blog.github.com/2017-11-29-use-any-theme-with-github-pages/) (GitHub Pages compatible), or forking/directly copying all of the theme files into your project. - -### Gem-based method - -With Gem-based themes, directories such as the `assets`, `_layouts`, `_includes`, and `_sass` are stored in the theme’s gem, hidden from your immediate view. Yet all of the necessary directories will be read and processed during Jekyll’s build process. - -This allows for easier installation and updating as you don't have to manage any of the theme files. To install: - -1. Add the following to your `Gemfile`: - - ```ruby - gem "minimal-mistakes-jekyll" - ``` - -2. Fetch and update bundled gems by running the following [Bundler](http://bundler.io/) command: - - ```bash - bundle - ``` - -3. Set the `theme` in your project's Jekyll `_config.yml` file: - - ```yaml - theme: minimal-mistakes-jekyll - ``` - -To update the theme run `bundle update`. - -### Remote theme method - -Remote themes are similar to Gem-based themes, but do not require `Gemfile` changes or whitelisting making them ideal for sites hosted with GitHub Pages. - -To install: - -1. Create/replace the contents of your `Gemfile` with the following: - - ```ruby - source "https://rubygems.org" - - gem "github-pages", group: :jekyll_plugins - ``` - -2. Add `jekyll-include-cache` to the `plugins` array of your `_config.yml`. - -3. Fetch and update bundled gems by running the following [Bundler](http://bundler.io/) command: - - ```bash - bundle - ``` - -4. Add `remote_theme: "mmistakes/minimal-mistakes@4.20.1"` to your `_config.yml` file. Remove any other `theme:` or `remote_theme:` entry. - -**Looking for an example?** Use the [Minimal Mistakes remote theme starter](https://github.com/mmistakes/mm-github-pages-starter/generate) for the quickest method of getting a GitHub Pages hosted site up and running. Generate a new repository from the starter, replace sample content with your own, and configure as needed. - -## Usage - -For detailed instructions on how to configure, customize, add/migrate content, and more read the [theme's documentation](https://mmistakes.github.io/minimal-mistakes/docs/quick-start-guide/). - ---- - -## Contributing - -Having trouble working with the theme? Found a typo in the documentation? Interested in adding a feature or [fixing a bug](https://github.com/mmistakes/minimal-mistakes/issues)? Then by all means [submit an issue](https://github.com/mmistakes/minimal-mistakes/issues/new) or [pull request](https://help.github.com/articles/using-pull-requests/). If this is your first pull request, it may be helpful to read up on the [GitHub Flow](https://guides.github.com/introduction/flow/) first. - -Minimal Mistakes has been designed as a base for you to customize and fit your site's unique needs. Please keep this in mind when requesting features and/or submitting pull requests. If it's not something that most people will use, I probably won't consider it. When in doubt ask. - -This goes for author sidebar links and "share button" additions -- I have no intention of merging in every possibly option, the essentials are there to get you started :smile:. - -### Pull Requests - -When submitting a pull request: - -1. Clone the repo. -2. Create a branch off of `master` and give it a meaningful name (e.g. `my-awesome-new-feature`). -3. Open a pull request on GitHub and describe the feature or fix. - -Theme documentation and demo pages can be found in the [`/docs`](docs) if submitting improvements, typo corrections, etc. - -## Development - -To set up your environment to develop this theme, run `bundle install`. - -To test the theme, run `bundle exec rake preview` and open your browser at `http://localhost:4000/test/`. This starts a Jekyll server using content in the `test/` directory. As modifications are made to the theme and test site, it will regenerate and you should see the changes in the browser after a refresh. - ---- - -## Credits - -### Creator - -**Michael Rose** - -- -- -- - -### Icons + Demo Images: - -- [The Noun Project](https://thenounproject.com) -- Garrett Knoll, Arthur Shlain, and [tracy tam](https://thenounproject.com/tracytam) -- [Font Awesome](http://fontawesome.io/) -- [Unsplash](https://unsplash.com/) - -### Other: - -- [Jekyll](http://jekyllrb.com/) -- [jQuery](http://jquery.com/) -- [Susy](http://susy.oddbird.net/) -- [Breakpoint](http://breakpoint-sass.com/) -- [Magnific Popup](http://dimsemenov.com/plugins/magnific-popup/) -- [FitVids.JS](http://fitvidsjs.com/) -- [GreedyNav.js](https://github.com/lukejacksonn/GreedyNav) -- [Smooth Scroll](https://github.com/cferdinandi/smooth-scroll) -- [Gumshoe](https://github.com/cferdinandi/gumshoe) -- [jQuery throttle / debounce](http://benalman.com/projects/jquery-throttle-debounce-plugin/) -- [Lunr](http://lunrjs.com) - ---- - -## License - -The MIT License (MIT) - -Copyright (c) 2013-2020 Michael Rose and contributors - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -Minimal Mistakes incorporates icons from [The Noun Project](https://thenounproject.com/) -creators Garrett Knoll, Arthur Shlain, and tracy tam. -Icons are distributed under Creative Commons Attribution 3.0 United States (CC BY 3.0 US). - -Minimal Mistakes incorporates [Font Awesome](http://fontawesome.io/), -Copyright (c) 2017 Dave Gandy. -Font Awesome is distributed under the terms of the [SIL OFL 1.1](http://scripts.sil.org/OFL) -and [MIT License](http://opensource.org/licenses/MIT). - -Minimal Mistakes incorporates photographs from [Unsplash](https://unsplash.com). - -Minimal Mistakes incorporates [Susy](http://susy.oddbird.net/), -Copyright (c) 2017, Miriam Eric Suzanne. -Susy is distributed under the terms of the [BSD 3-clause "New" or "Revised" License](https://opensource.org/licenses/BSD-3-Clause). - -Minimal Mistakes incorporates [Breakpoint](http://breakpoint-sass.com/). -Breakpoint is distributed under the terms of the [MIT/GPL Licenses](http://opensource.org/licenses/MIT). - -Minimal Mistakes incorporates [FitVids.js](https://github.com/davatron5000/FitVids.js/), -Copyright (c) 2013 Dave Rubert and Chris Coyier. -FitVids is distributed under the terms of the [WTFPL License](http://www.wtfpl.net/). - -Minimal Mistakes incorporates [Magnific Popup](http://dimsemenov.com/plugins/magnific-popup/), -Copyright (c) 2014-2016 Dmitry Semenov, http://dimsemenov.com. -Magnific Popup is distributed under the terms of the MIT License. - -Minimal Mistakes incorporates [Smooth Scroll](http://github.com/cferdinandi/smooth-scroll), -Copyright (c) 2019 Chris Ferdinandi. -Smooth Scroll is distributed under the terms of the [MIT License](http://opensource.org/licenses/MIT). - -Minimal Mistakes incorporates [Gumshoejs](http://github.com/cferdinandi/gumshoe), -Copyright (c) 2019 Chris Ferdinandi. -Smooth Scroll is distributed under the terms of the [MIT License](http://opensource.org/licenses/MIT). - -Minimal Mistakes incorporates [jQuery throttle / debounce](http://benalman.com/projects/jquery-throttle-debounce-plugin/), -Copyright (c) 2010 "Cowboy" Ben Alman. -jQuery throttle / debounce is distributed under the terms of the [MIT License](http://opensource.org/licenses/MIT). - -Minimal Mistakes incorporates [GreedyNav.js](https://github.com/lukejacksonn/GreedyNav), -Copyright (c) 2015 Luke Jackson. -GreedyNav.js is distributed under the terms of the [MIT License](http://opensource.org/licenses/MIT). - -Minimal Mistakes incorporates [Jekyll Group-By-Array](https://github.com/mushishi78/jekyll-group-by-array), -Copyright (c) 2015 Max White . -Jekyll Group-By-Array is distributed under the terms of the [MIT License](http://opensource.org/licenses/MIT). - -Minimal Mistakes incorporates [@allejo's Pure Liquid Jekyll Table of Contents](https://allejo.io/blog/a-jekyll-toc-in-liquid-only/), -Copyright (c) 2017 Vladimir Jimenez. -Pure Liquid Jekyll Table of Contents is distributed under the terms of the [MIT License](http://opensource.org/licenses/MIT). - -Minimal Mistakes incorporates [Lunr](http://lunrjs.com), -Copyright (c) 2018 Oliver Nightingale. -Lunr is distributed under the terms of the [MIT License](http://opensource.org/licenses/MIT). diff --git a/_config.yml b/_config.yml index d8203dba..39dc2a65 100644 --- a/_config.yml +++ b/_config.yml @@ -12,7 +12,7 @@ # theme : "minimal-mistakes-jekyll" # remote_theme : "mmistakes/minimal-mistakes" -minimal_mistakes_skin : "air" # "air", "aqua", "contrast", "dark", "dirt", "neon", "mint", "plum", "sunrise" +minimal_mistakes_skin : "contrast" # "air", "aqua", "contrast", "dark", "dirt", "neon", "mint", "plum", "sunrise" # Site Settings locale : "en-US" @@ -25,7 +25,7 @@ url : # the base hostname & protocol for your site e.g. "ht baseurl : # the subpath of your site, e.g. "/blog" repository : # GitHub username/repo-name e.g. "mmistakes/minimal-mistakes" teaser : # path of fallback teaser image, e.g. "/assets/images/500x300.png" -logo : # path of logo image to display in the masthead, e.g. "/assets/images/88x88.png" +logo : "/assets/images/logo.png" masthead_title : # overrides the website title displayed in the masthead, use " " for no title # breadcrumbs : false # true, false (default) words_per_minute : 200 diff --git a/_data/navigation.yml b/_data/navigation.yml index 562d652f..44162f14 100644 --- a/_data/navigation.yml +++ b/_data/navigation.yml @@ -1,8 +1,10 @@ # main links main: - title: "About" - url: /about/ + url: / - title: "Get Started" - url: /start/ - - title: "SpecInfer" - url: /specInfer/ + url: https://flexflow.readthedocs.io/en/latest/installation.html + - title: "Documentation" + url: https://flexflow.readthedocs.io/ + - title: "Code" + url: https://github.com/flexflow/FlexFlow diff --git a/_includes/head/custom.html b/_includes/head/custom.html index 978d84fd..59332b9e 100644 --- a/_includes/head/custom.html +++ b/_includes/head/custom.html @@ -2,4 +2,14 @@ + + + + + + + + + + diff --git a/_pages/about.md b/_pages/about.md deleted file mode 100644 index a98db23f..00000000 --- a/_pages/about.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -title: About FlexFlow -layout: single -permalink: /about/ -#toc: true -#toc_sticky: true -author_profile: true -classes: wide -header: - overlay_image: /assets/images/header.jpg ---- - -FlexFlow is a DNN framework that automatically discovers fast parallelization strategies for distributed DNN training. -FlexFlow generalizes and goes beyond today's manually designed parallelization strategies (e.g., data and model parallelism) for distributed DNN training by exploring parallelization opportunities across different Samples, Operators, Attributes, and Parameters. - -FlexFlow includes a novel execution simulator to evaluate the runtime performance of different strategies and uses an automated search algorithm to discover highly optimized strategies, which generally outperform today's manually designed strategies. - -FlexFlow provides the following key features: - -* **Flexible Parallelization**. FlexFlow supports parallelizing DNN training through combinations of the [Sample, Operator, Attribute, and Parameter](https://cs.stanford.edu/~zhihao/papers/sysml19a.pdf) dimensions, and guarantees that different parallelization strategies maintain the same model accuracy by design. - -* **Joint Optimization**. FlexFlow uses a novel hierarchical search algorithm -to jointly optimize [algebraic transformations and parallelization](https://www.cs.cmu.edu/~zhihaoj2/papers/unity_osdi22.pdf) while maintaining scalability. - -* **Speculative Inference**. FlexFlow accelerates generative LLM inference with [speculative inference and token tree verification](https://arxiv.org/abs/2305.09781). \ No newline at end of file diff --git a/_pages/gnn.md b/_pages/gnn.md deleted file mode 100644 index 082d7f62..00000000 --- a/_pages/gnn.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -title: Large-Scale GNNs -layout: single -permalink: /gnn/ -classes: wide -#toc: true -#toc_sticky: true -author_profile: true -header: - overlay_image: /assets/images/header.jpg ---- - -Graph neural networks (GNNs) combine DNN techniques (e.g., convolution) with iterative graph propagation (e.g., neighbor aggregation) and have been demonstrated to be an effective model for learning tasks related to graph structured data. -However, existing DNN frameworks cannot easily support GNN training and inference on large-scale graphs, since different from conventional DNN models, GNNs generally use small DNN models on very large and irregular input graphs that do not fit in a single GPU. - -FlexFlow enables fast GNN training on large (e.g., billion-edge) graphs using [attribute parallelism](https://cs.stanford.edu/~zhihao/papers/mlsys20.pdf), which leverages the compute resources of multiple GPUs to train GNN models on large (e.g., billion-edge) real-world graphs. - -
- -
- -See more [examples](https://github.com/jiazhihao/roc) that use FlexFlow to train large GNN models. diff --git a/_pages/keras.md b/_pages/keras.md deleted file mode 100644 index 21cae4e2..00000000 --- a/_pages/keras.md +++ /dev/null @@ -1,46 +0,0 @@ ---- -title: Keras Support -layout: single -permalink: /keras/ -#toc: true -#toc_sticky: true -author_profile: true -classes: wide -header: - overlay_image: /assets/images/header.jpg ---- - -FlexFlow provides a drop-in replacement for TensorFlow Keras. -Running an existing Keras program on the FlexFlow backend only requires a few lines of changes to the program. - -First, we need to redirect the program to import Keras functions from FlexFlow by using the following import header lines. -``` -from flexflow.keras.models import Model, Sequential -from flexflow.keras.layers import Input, Dense, Conv2D, ... -from flexflow.keras.callbacks import Callback, ... -``` - -Second, FlexFlow requires a Keras program to wrap its model construction in a Python function called `top_level_task()`. This allows FlexFlow to automatically parallelize DNN training across all GPUs on all compute nodes. -For example, the following code snippet shows parallelizing AlexNet training in FlexFlow. More Keras examples are available on [GitHub](https://github.com/flexflow/FlexFlow/tree/master/examples/python/keras). -``` -def top_level_task(): - model = Sequential() - model.add(Conv2D(filters=64, input_shape=(3,229,229), kernel_size=(11,11), strides=(4,4), padding=(2,2), activation="relu")) - model.add(MaxPooling2D(pool_size=(3,3), strides=(2,2), padding="valid")) - model.add(Conv2D(filters=192, kernel_size=(5,5), strides=(1,1), padding=(2,2), activation="relu")) - ## More lines for model construction - model.add(Activation("softmax")) - ## Model compilation - model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) - ## Model training - (x_train, y_train) = cifar10.load_data() - model.fit(x_train, y_train, epochs=30) - -if __name__ == "__main__": - top_level_task() -``` -During model compilation (i.e., `model.compile`), FlexFlow can [autotune](https://flexflow.ai/search) the parallelization performance by searching for efficient strategies to parallelize the DNN model on the given parallel machine. -Next, `model.fit` performs DNN training on all available GPUs (potentially across multiple compute nodes) by parallelizing the training computations using the best discovered strategy. As a result, users don't need to manually design and optimize the device assignments. - - - diff --git a/_pages/search.md b/_pages/search.md deleted file mode 100644 index 4d2031c4..00000000 --- a/_pages/search.md +++ /dev/null @@ -1,93 +0,0 @@ ---- -title: Performance Autotuning -layout: single -permalink: /search/ -classes: wide -#toc: true -#toc_sticky: true -author_profile: true -header: - overlay_image: /assets/images/header.jpg - ---- - -FlexFlow enables performance autotuning by automatically searching for optimized parallelization strategies during model compilation. FlexFlow explores the [SOAP search space](https://cs.stanford.edu/~zhihao/papers/sysml19a.pdf), which identifies four parallelizable dimensions and captures potential parallelization opportunities across different Samples, Operators, Attributes, and Parameters. - -A key property of the SOAP search space is that all strategies perform the same computation defined by the DNN model and therefore maintain the same model accuracy by design. -FlexFlow performs Markov Chain Monte Carlo (MCMC) search over the SOAP search space to discover performant parallelization strategies for a given parallel machine. - -## Searching For Fast Parallelization Strategies - -FlexFlow performs MCMC search during model compilation (i.e., `model.compile`) and uses the following configuration flags to control the search procedure. -* `--search-budget` or `--budget` (default 0): the number of iterations for the MCMC search. -* `--search-alpha` or `--alpha` (default 0.05): a hyper-parameter for the search procedure (see below). -* `--export-strategy` or `--export` (default None): path to export the best discovered strategy. -* `--import-strategy` or `--import` (default None): path to import a previous saved strategy. - -FlexFlow uses a hyper-parameter alpha (>= 0) to controls the probability that a newly proposed strategy is accepted by the MCMC search. By setting alpha = 0, the MCMC search becomes a fully randomized search algorithm, which accepts all new proposals. As alpha increases, the search algorithm gradually becomes a greedy algorithm that prefers to accepts new proposals that stictly improve the training performance. For more details, see [our paper](https://cs.stanford.edu/~zhihao/papers/sysml19a.pdf). - -The MCMC search algorithm starts from data parallelism by default. To guarantee that data parallelism is valid, make sure the global batch size is a multiplier of the total number of GPUs used for training. - -To export the best discovered strategy to an external file, set the `--export-strategy` flag. -``` -./flexflow_python dlrm.py -ll:gpu 4 -ll:fsize 12000 --search-budget 10000 --export-strategy /path/to/strategy -``` - -Alternatively, to import a previous saved strategy, simply set the `--import-strategy` flag. -``` -./flexflow_python dlrm.py -ll:gpu 4 -ll:fsize 12000 --import-strategy /path/to/strategy -``` -Note that by setting the `--import-strategy` flag, FlexFlow will skip the MCMC search procedure and directly use the imported strategy to parallelize training. - -## Case Study: Deep Learning Recommendation Model - -We use the [Deep Learning Recommendation Model](https://github.com/facebookresearch/dlrm) (DLRM) to demonstrate the FlexFlow performance autotuning. -The model uses embedding layers to process sparse input features representing -categorical data, and uses the bottom neural network to process dense input features. DLRM has a -feature interaction operator that combines the representations learnt from both the dense and sparse -features (e.g., concatenating the representations). The output of the feature interaction operator is -then sent to the top neural network for downstream prediction tasks. - -

- -

- -Using the following command line, FlexFlow searches for an optimized strategy to parallelize DLRM training on 4 GPUs on a single node. -``` -./dlrm -ll:gpu 4 -ll:fsize 12000 -ll:zsize 20000 --arch-sparse-feature-size 64 --arch-embedding-size 1000000-1000000-1000000-1000000-1000000-1000000-1000000-1000000 --arch-mlp-bot 64-512-512-64 --arch-mlp-top 576-1024-1024-1024-1 --batch-size 1024 --budget 1000 -``` - -Different executions of the search procedure may discover different optimized strategies, one of which is shown as follows. -``` -========== Strategy Search Started ========== -iter(0) cur(7.93) next(3.46) best(7.93) -iter(100) cur(6.94) next(6.96) best(5.76) -iter(200) cur(6.54) next(7.03) best(5.76) -iter(300) cur(6.75) next(6.75) best(5.68) -iter(400) cur(2.37) next(6.61) best(2.18) -iter(500) cur(2.23) next(2.23) best(2.18) -iter(600) cur(2.41) next(6.86) best(2.11) -iter(700) cur(2.14) next(2.14) best(2.11) -iter(800) cur(2.32) next(6.74) best(2.11) -iter(900) cur(2.80) next(2.80) best(2.11) -iter(1000) cur(2.49) next(6.96) best(2.11) -========== Strategy Search Completed ========== -[Dense_512_100] num_dims(2) dims[1,4] device_ids[0,1,2,3] -[Dense_512_101] num_dims(2) dims[1,1] device_ids[1] -[Dense_64_102] num_dims(2) dims[1,1] device_ids[1] -[Embed_64_103] num_dims(2) dims[1,1] device_ids[0] -[Embed_64_104] num_dims(2) dims[1,1] device_ids[2] -[Embed_64_105] num_dims(2) dims[1,1] device_ids[3] -[Embed_64_106] num_dims(2) dims[1,1] device_ids[2] -[Embed_64_107] num_dims(2) dims[1,1] device_ids[3] -[Embed_64_108] num_dims(2) dims[1,1] device_ids[0] -[Embed_64_109] num_dims(2) dims[1,1] device_ids[2] -[Embed_64_110] num_dims(2) dims[1,1] device_ids[0] -[Concat_1_111] num_dims(2) dims[1,4] device_ids[0,1,2,3] -[Dense_1024_112] num_dims(2) dims[1,4] device_ids[0,1,2,3] -[Dense_1024_113] num_dims(2) dims[1,4] device_ids[0,1,2,3] -[Dense_1024_114] num_dims(2) dims[2,1] device_ids[1,2] -[Dense_1_115] num_dims(2) dims[2,1] device_ids[1,2] -``` -Each line describes the parallelization configuration for one operator: `dims` indicates the degree of parallelism for each dimension, and `device_ids` shows the device assignment for each task within an operator. -This strategy combines parallelization opportunities across different Samples, Operators, and Parameters, and is 3.8x faster than data parallelism. diff --git a/_pages/specInfer.md b/_pages/specInfer.md index c39a1b85..71923eda 100644 --- a/_pages/specInfer.md +++ b/_pages/specInfer.md @@ -7,7 +7,8 @@ classes: wide #toc_sticky: true author_profile: true header: - overlay_image: /assets/images/header.jpg + overlay_image: /assets/images/banner.png + overlay_filter: rgba(255, 255, 255, 0.8) --- # SpecInfer: Accelerating Generative LLM Serving with Speculative Inference and Token Tree Verification diff --git a/_pages/start.md b/_pages/start.md deleted file mode 100644 index dfefc370..00000000 --- a/_pages/start.md +++ /dev/null @@ -1,142 +0,0 @@ ---- -title: Installing FlexFlow -layout: single -permalink: /start/ -classes: wide -#toc: true -#toc_sticky: true -author_profile: true -header: - overlay_image: /assets/images/header.jpg - ---- - -# Installing FlexFlow -FlexFlow can be built from source code using the following instructions. - -## Prerequisties -* [CUDNN](https://developer.nvidia.com/cudnn) is used to perform low-level operations. -Download and install CUDNN locally. - -* [Legion](http://legion.stanford.edu) is the underlying runtime FlexFlow built on. - -* [Protocol Buffer](https://github.com/protocolbuffers/protobuf) is used for representing parallelization strategies in FlexFlow. - -* (Optional) [NCCL](https://github.com/NVIDIA/nccl) is used for parameter synchronization. When NCCL is not available, FlexFlow uses the Legion DMA subsystem for transferring parameters. - -* (Optional) [GASNet](http://gasnet.lbl.gov) is used for multi-node executions. (see [GASNet installation instructions](http://legion.stanford.edu/gasnet)) - - -## 1. Download the source code -Clone the FlexFlow source code, and the third-party dependencies from GitHub. -``` -git clone --recursive https://github.com/flexflow/FlexFlow.git -``` - -## 2. Install system dependencies -FlexFlow has system dependencies on cuda and/or rocm depending on which gpu backend you target. The gpu backend is configured by the cmake variable `FF_GPU_BACKEND`. By default, FlexFlow targets CUDA. `docker/base/Dockerfile` installs system dependencies in a standard ubuntu system. - -### Targeting CUDA - `FF_GPU_BACKEND=cuda` -If you are targeting CUDA, FlexFlow requires CUDA and CUDNN to be installed. You can follow the standard nvidia installation instructions [CUDA](https://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html) and [CUDNN](https://docs.nvidia.com/deeplearning/cudnn/install-guide/index.html). - -Disclaimer: CUDA architectures < 60 (Maxwell and older) are no longer supported. - -### Targeting ROCM - `FF_GPU_BACKEND=hip_rocm` -If you are targeting ROCM, FlexFlow requires a ROCM and HIP installation with a few additional packages. Note that this can be done on a system with or without an AMD GPU. You can follow the standard installation instructions [ROCM](https://docs.amd.com/bundle/ROCm-Installation-Guide-v5.3/page/Introduction_to_ROCm_Installation_Guide_for_Linux.html) and [HIP](https://docs.amd.com/bundle/HIP-Installation-Guide-v5.3/page/Introduction_to_HIP_Installation_Guide.html). When running `amdgpu-install`, install the use cases hip and rocm. You can avoid installing the kernel drivers (not necessary on systems without an AMD graphics card) with `--no-dkms` I.e. `amdgpu-install --usecase=hip,rocm --no-dkms`. Additionally, install the packages `hip-dev`, `hipblas`, `miopen-hip`, and `rocm-hip-sdk`. - -See `./docker/base/Dockerfile` for an example ROCM install. - -### Targeting CUDA through HIP - `FF_GPU_BACKEND=hip_cuda` -This is not currently supported. - -## 3. Install the Python dependencies -If you are planning to build the Python interface, you will need to install several additional Python libraries, please check [this](https://github.com/flexflow/FlexFlow/blob/master/requirements.txt) for details. If you are only looking to use the C++ interface, you can skip to the next section. - -**We recommend that you create your own `conda` environment and then install the Python dependencies, to avoid any version mismatching with your system pre-installed libraries.** - -The `conda` environment can be created and activated as: -``` -conda env create -f conda/environment.yml -conda activate flexflow -``` - -## 4. Configuring the FlexFlow build -You can configure a FlexFlow build by running the `config/config.linux` file in the build folder. If you do not want to build with the default options, you can set your configurations by passing (or exporting) the relevant environment variables. We recommend that you spend some time familiarizing with the available options by scanning the `config/config.linux` file. In particular, the main parameters are: - -1. `CUDA_DIR` is used to specify the directory of CUDA. It is only required when CMake can not automatically detect the installation directory of CUDA. -2. `CUDNN_DIR` is used to specify the directory of CUDNN. It is only required when CUDNN is not installed in the CUDA directory. -3. `FF_CUDA_ARCH` is used to set the architecture of targeted GPUs, for example, the value can be 60 if the GPU architecture is Pascal. To build for more than one architecture, pass a list of comma separated values (e.g. `FF_CUDA_ARCH=70,75`). To compile FlexFlow for all GPU architectures that are detected on the machine, pass `FF_CUDA_ARCH=autodetect` (this is the default value, so you can also leave `FF_CUDA_ARCH` unset. If you want to build for all GPU architectures compatible with FlexFlow, pass `FF_CUDA_ARCH=all`. **If your machine does not have any GPU, you have to set FF_CUDA_ARCH to at least one valid architecture code (or `all`)**, since the compiler won't be able to detect the architecture(s) automatically. -4. `FF_USE_PYTHON` controls whether to build the FlexFlow Python interface. -5. `FF_USE_NCCL` controls whether to build FlexFlow with NCCL support. By default, it is set to ON. -6. `FF_LEGION_NETWORKS` is used to enable distributed run of FlexFlow. If you want to run FlexFlow on multiple nodes, follow instructions in [MULTI-NODE.md](MULTI-NODE.md) and set the corresponding parameters as follows: -* To build FlexFlow with GASNet, set `FF_LEGION_NETWORKS=gasnet` and `FF_GASNET_CONDUIT` as a specific conduit (e.g. `ibv`, `mpi`, `udp`, `ucx`) in `config/config.linux` when configuring the FlexFlow build. Set `FF_UCX_URL` when you want to customize the URL to download UCX. -* To build FlexFlow with native UCX, set `FF_LEGION_NETWORKS=ucx` in `config/config.linux` when configuring the FlexFlow build. Set `FF_UCX_URL` when you want to customize the URL to download UCX. -8. `FF_BUILD_EXAMPLES` controls whether to build all C++ example programs. -9. `FF_MAX_DIM` is used to set the maximum dimension of tensors, by default it is set to 4. -10. `FF_USE_{NCCL,LEGION,ALL}_PRECOMPILED_LIBRARY`, controls whether to build FlexFlow using a pre-compiled version of the Legion, NCCL (if `FF_USE_NCCL` is `ON`), or both libraries . By default, `FF_USE_NCCL_PRECOMPILED_LIBRARY` and `FF_USE_LEGION_PRECOMPILED_LIBRARY` are both set to `ON`, allowing you to build FlexFlow faster. If you want to build Legion and NCCL from source, set them to `OFF`. - -More options are available in cmake, please run `ccmake` and search for options starting with FF. - -## 5. Build FlexFlow -You can build FlexFlow in three ways: with CMake, with Make, and with `pip`. We recommend that you use the CMake building system as it will automatically build all C++ dependencies inlcuding NCCL and Legion. - -### Building FlexFlow with CMake -To build FlexFlow with CMake, go to the FlexFlow home directory, and run -``` -mkdir build -cd build -../config/config.linux -make -j N -``` -where N is the desired number of threads to use for the build. - -### Building FlexFlow with pip -To build Flexflow with `pip`, run `pip install .` from the FlexFlow home directory. This command will build FlexFlow, and also install the Python interface as a Python module. - -### Building FlexFlow with Make -The Makefile we provide is mainly for development purposes, and may not be fully up to date. To use it, run: -``` -cd python -make -j N -``` - -## 6. Test FlexFlow -After building FlexFlow, you can test it to ensure that the build completed without issue, and that your system is ready to run FlexFlow. - -### Set the `FF_HOME` environment variable before running FlexFlow. To make it permanent, you can add the following line in ~/.bashrc. -``` -export FF_HOME=/path/to/FlexFlow -``` - -### Run FlexFlow Python examples -The Python examples are in the [examples/python](https://github.com/flexflow/FlexFlow/tree/master/examples/python). The native, Keras integration and PyTorch integration examples are listed in `native`, `keras` and `pytorch` respectively. - -To run the Python examples, you have two options: you can use the `flexflow_python` interpreter, available in the `python` folder, or you can use the native Python interpreter. If you choose to use the native Python interpreter, you should either install FlexFlow, or, if you prefer to build without installing, export the following flags: - -* `export PYTHONPATH="${FF_HOME}/python:${FF_HOME}/build/python"` -* `export FF_USE_NATIVE_PYTHON=1` - -**We recommend that you run the** `mnist_mlp` **test under** `native` **using the following cmd to check if FlexFlow has been installed correctly:** - -``` -cd "$FF_HOME" -./python/flexflow_python examples/python/native/mnist_mlp.py -ll:py 1 -ll:gpu 1 -ll:fsize -ll:zsize -``` -A script to run all the Python examples is available at `tests/multi_gpu_tests.sh` - -### Run FlexFlow C++ examples - -The C++ examples are in the [examples/cpp](https://github.com/flexflow/FlexFlow/tree/master/examples/cpp). -For example, the AlexNet can be run as: -``` -./alexnet -ll:gpu 1 -ll:fsize -ll:zsize -``` - -Size of buffers is in MBs, e.g. for an 8GB gpu `-ll:fsize 8000` - -## 7. Install FlexFlow -If you built/installed FlexFlow using `pip`, this step is not required. If you built using Make or CMake, install FlexFlow with: -``` -cd build -make install -``` \ No newline at end of file diff --git a/_sass/minimal-mistakes/_page.scss b/_sass/minimal-mistakes/_page.scss index fb8461e9..28630d11 100644 --- a/_sass/minimal-mistakes/_page.scss +++ b/_sass/minimal-mistakes/_page.scss @@ -187,17 +187,27 @@ body { padding-left: 1em; padding-right: 1em; + @include breakpoint($small) { + padding-left: 2.5em; + padding-right: 2.5em; + } + @include breakpoint($x-large) { max-width: $x-large; } } - .page__title, + .page__title { + //header title + color: #000; + // text-shadow: 1px 1px 4px rgba(#000, 0.2); + } .page__meta, .page__lead, .btn { - color: #fff; - text-shadow: 1px 1px 4px rgba(#000, 0.5); + // subtitle of header + color: #000; + // text-shadow: 1px 1px 4px rgba(#000, 0.2); } .page__lead { diff --git a/_sass/minimal-mistakes/skins/_contrast.scss b/_sass/minimal-mistakes/skins/_contrast.scss index d5d9e2fa..69d39505 100644 --- a/_sass/minimal-mistakes/skins/_contrast.scss +++ b/_sass/minimal-mistakes/skins/_contrast.scss @@ -5,7 +5,7 @@ /* Colors */ $text-color: #000 !default; $muted-text-color: $text-color !default; -$primary-color: #1f77b4 !default; +$primary-color: #ec7e38 !default; $border-color: mix(#fff, $text-color, 75%) !default; $footer-background-color: #000 !default; $link-color: #0000ff !default; diff --git a/android-chrome-144x144.png b/android-chrome-144x144.png new file mode 100644 index 0000000000000000000000000000000000000000..95326b1e89528286c14c4f6e5226f0e867f457b1 GIT binary patch literal 3686 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 literal 0 HcmV?d00001 diff --git a/apple-touch-icon.png b/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..4fd0a0cdfc7b223f597401a58864d257ba54a5f6 GIT binary patch literal 4487 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 literal 0 HcmV?d00001 diff --git a/assets/images/banner.svg b/assets/images/banner.svg new file mode 100644 index 00000000..3ea11368 --- /dev/null +++ b/assets/images/banner.svg @@ -0,0 +1,282 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/images/logo.png b/assets/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..476dafe793f0a9fe2f0bf65b8fa922bcda49383e GIT binary patch literal 3524 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 F`5)=y+s*(0 literal 0 HcmV?d00001 diff --git a/assets/images/logo.svg b/assets/images/logo.svg new file mode 100644 index 00000000..c1f25bc6 --- /dev/null +++ b/assets/images/logo.svg @@ -0,0 +1,255 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/browserconfig.xml b/browserconfig.xml new file mode 100644 index 00000000..b3930d0f --- /dev/null +++ b/browserconfig.xml @@ -0,0 +1,9 @@ + + + + + + #da532c + + + diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 00000000..2757638c --- /dev/null +++ b/docs/README.md @@ -0,0 +1,273 @@ +# [Minimal Mistakes Jekyll theme](https://mmistakes.github.io/minimal-mistakes/) + +[![LICENSE](https://img.shields.io/badge/license-MIT-lightgrey.svg)](https://raw.githubusercontent.com/mmistakes/minimal-mistakes/master/LICENSE) +[![Jekyll](https://img.shields.io/badge/jekyll-%3E%3D%203.7-blue.svg)](https://jekyllrb.com/) +[![Ruby gem](https://img.shields.io/gem/v/minimal-mistakes-jekyll.svg)](https://rubygems.org/gems/minimal-mistakes-jekyll) +[![Tip Me via PayPal](https://img.shields.io/badge/PayPal-tip%20me-green.svg?logo=paypal)](https://www.paypal.me/mmistakes) + +Minimal Mistakes is a flexible two-column Jekyll theme, perfect for building personal sites, blogs, and portfolios. As the name implies, styling is purposely minimalistic to be enhanced and customized by you :smile:. + +:sparkles: See what's new in the [CHANGELOG](CHANGELOG.md). + +**If you enjoy this theme, please consider [supporting me](https://www.paypal.me/mmistakes) to continue developing and maintaining it.** + +[![Support via PayPal](https://cdn.jsdelivr.net/gh/twolfson/paypal-github-button@1.0.0/dist/button.svg)](https://www.paypal.me/mmistakes) + +**Note:** The theme uses the [jekyll-include-cache](https://github.com/benbalter/jekyll-include-cache) plugin which will need to be installed in your `Gemfile` and added to the `plugins` array of `_config.yml`. Otherwise you'll encounter `Unknown tag 'include_cached'` errors at build. + +[![Minimal Mistakes live preview][2]][1] + +[1]: https://mmistakes.github.io/minimal-mistakes/ +[2]: screenshot.png (live preview) + +![layout examples](screenshot-layouts.png) + +## Notable features + +- Bundled as a "theme gem" for easier installation/upgrading. +- Compatible with GitHub Pages. +- Support for Jekyll's built-in Sass/SCSS preprocessor. +- Nine different skins (color variations). +- Several responsive layout options (single, archive index, search, splash, and paginated home page). +- Optimized for search engines with support for [Twitter Cards](https://dev.twitter.com/cards/overview) and [Open Graph](http://ogp.me/) data. +- Optional [header images](https://mmistakes.github.io/minimal-mistakes/docs/layouts/#headers), [custom sidebars](https://mmistakes.github.io/minimal-mistakes/docs/layouts/#sidebars), [table of contents](https://mmistakes.github.io/minimal-mistakes/docs/helpers/#table-of-contents), [galleries](https://mmistakes.github.io/minimal-mistakes/docs/helpers/#gallery), related posts, [breadcrumb links](https://mmistakes.github.io/minimal-mistakes/docs/configuration/#breadcrumb-navigation-beta), [navigation lists](https://mmistakes.github.io/minimal-mistakes/docs/helpers/#navigation-list), and more. +- Commenting support (powered by [Disqus](https://disqus.com/), [Facebook](https://developers.facebook.com/docs/plugins/comments), Google+, [Discourse](https://www.discourse.org/), static-based via [Staticman](https://staticman.net/), and [utterances](https://utteranc.es/)). +- [Google Analytics](https://www.google.com/analytics/) support. +- UI localized text in English (default), Brazilian Portuguese (Português brasileiro), Catalan, Chinese, Danish, Dutch, Finnish, French (Français), German (Deutsch), Greek, Hindi (हिंदी), Hungarian, Indonesian, Irish (Gaeilge), Italian (Italiano), Japanese, Korean, Malayalam, Myanmar (Burmese), Nepali (Nepalese), Persian (فارسی), Polish, Punjabi (ਪੰਜਾਬੀ), Romanian, Russian, Slovak, Spanish (Español), Swedish, Thai, Turkish (Türkçe), and Vietnamese. + +## Skins (color variations) + +This theme comes in nine different skins (in addition to the default one). + +| `air` | `contrast` | `dark` | +| --- | --- | --- | +| [![air skin](https://mmistakes.github.io/minimal-mistakes/assets/images/air-skin-archive.png)](https://mmistakes.github.io/minimal-mistakes/assets/images/air-skin-archive-large.png) | [![contrast skin](https://mmistakes.github.io/minimal-mistakes/assets/images/contrast-skin-archive.png)](https://mmistakes.github.io/minimal-mistakes/assets/images/contrast-skin-archive-large.png) | [![dark skin](https://mmistakes.github.io/minimal-mistakes/assets/images/dark-skin-archive.png)](https://mmistakes.github.io/minimal-mistakes/assets/images/dark-skin-archive-large.png) | + +| `dirt` | `mint` | `sunrise` | +| --- | --- | --- | +| [![dirt skin](https://mmistakes.github.io/minimal-mistakes/assets/images/dirt-skin-archive.png)](https://mmistakes.github.io/minimal-mistakes/assets/images/dirt-skin-archive-large.png) | [![mint skin](https://mmistakes.github.io/minimal-mistakes/assets/images/mint-skin-archive.png)](https://mmistakes.github.io/minimal-mistakes/assets/images/mint-skin-archive-large.png) | [![sunrise skin](https://mmistakes.github.io/minimal-mistakes/assets/images/sunrise-skin-archive.png)](https://mmistakes.github.io/minimal-mistakes/assets/images/sunrise-skin-archive-large.png) | + +| `aqua` | `neon` | `plum` | +| --- | --- | --- | +| [![aqua skin](https://mmistakes.github.io/minimal-mistakes/assets/images/aqua-skin-archive.png)](https://mmistakes.github.io/minimal-mistakes/assets/images/aqua-skin-archive-large.png) | [![neon skin](https://mmistakes.github.io/minimal-mistakes/assets/images/neon-skin-archive.png)](https://mmistakes.github.io/minimal-mistakes/assets/images/neon-skin-archive-large.png) | [![plum skin](https://mmistakes.github.io/minimal-mistakes/assets/images/plum-skin-archive.png)](https://mmistakes.github.io/minimal-mistakes/assets/images/plum-skin-archive-large.png) | + +## Demo pages + +| Name | Description | +| ------------------------------------------- | ----------------------------------------------------- | +| [Post with Header Image][header-image-post] | A post with a large header image. | +| [HTML Tags and Formatting Post][html-tags-post] | A variety of common markup showing how the theme styles them. | +| [Syntax Highlighting Post][syntax-post] | Post displaying highlighted code. | +| [Post with a Gallery][gallery-post] | A post showing several images wrapped in `
` elements. | +| [Sample Collection Page][sample-collection] | Single page from a collection. | +| [Categories Archive][categories-archive] | Posts grouped by category. | +| [Tags Archive][tags-archive] | Posts grouped by tag. | + +Additional sample posts are available under [posts archive][year-archive] on the demo site. Source files for these (and the entire demo site) can be found in [`/docs`](docs). + +[header-image-post]: https://mmistakes.github.io/minimal-mistakes/layout-header-image-text-readability/ +[gallery-post]: https://mmistakes.github.io/minimal-mistakes/post%20formats/post-gallery/ +[html-tags-post]: https://mmistakes.github.io/minimal-mistakes/markup/markup-html-tags-and-formatting/ +[syntax-post]: https://mmistakes.github.io/minimal-mistakes/markup-syntax-highlighting/ +[sample-collection]: https://mmistakes.github.io/minimal-mistakes/recipes/chocolate-chip-cookies/ +[categories-archive]: https://mmistakes.github.io/minimal-mistakes/categories/ +[tags-archive]: https://mmistakes.github.io/minimal-mistakes/tags/ +[year-archive]: https://mmistakes.github.io/minimal-mistakes/year-archive/ + +## Installation + +There are three ways to install: as a [gem-based theme](https://jekyllrb.com/docs/themes/#understanding-gem-based-themes), as a [remote theme](https://blog.github.com/2017-11-29-use-any-theme-with-github-pages/) (GitHub Pages compatible), or forking/directly copying all of the theme files into your project. + +### Gem-based method + +With Gem-based themes, directories such as the `assets`, `_layouts`, `_includes`, and `_sass` are stored in the theme’s gem, hidden from your immediate view. Yet all of the necessary directories will be read and processed during Jekyll’s build process. + +This allows for easier installation and updating as you don't have to manage any of the theme files. To install: + +1. Add the following to your `Gemfile`: + + ```ruby + gem "minimal-mistakes-jekyll" + ``` + +2. Fetch and update bundled gems by running the following [Bundler](http://bundler.io/) command: + + ```bash + bundle + ``` + +3. Set the `theme` in your project's Jekyll `_config.yml` file: + + ```yaml + theme: minimal-mistakes-jekyll + ``` + +To update the theme run `bundle update`. + +### Remote theme method + +Remote themes are similar to Gem-based themes, but do not require `Gemfile` changes or whitelisting making them ideal for sites hosted with GitHub Pages. + +To install: + +1. Create/replace the contents of your `Gemfile` with the following: + + ```ruby + source "https://rubygems.org" + + gem "github-pages", group: :jekyll_plugins + ``` + +2. Add `jekyll-include-cache` to the `plugins` array of your `_config.yml`. + +3. Fetch and update bundled gems by running the following [Bundler](http://bundler.io/) command: + + ```bash + bundle + ``` + +4. Add `remote_theme: "mmistakes/minimal-mistakes@4.20.1"` to your `_config.yml` file. Remove any other `theme:` or `remote_theme:` entry. + +**Looking for an example?** Use the [Minimal Mistakes remote theme starter](https://github.com/mmistakes/mm-github-pages-starter/generate) for the quickest method of getting a GitHub Pages hosted site up and running. Generate a new repository from the starter, replace sample content with your own, and configure as needed. + +## Usage + +For detailed instructions on how to configure, customize, add/migrate content, and more read the [theme's documentation](https://mmistakes.github.io/minimal-mistakes/docs/quick-start-guide/). + +--- + +## Contributing + +Having trouble working with the theme? Found a typo in the documentation? Interested in adding a feature or [fixing a bug](https://github.com/mmistakes/minimal-mistakes/issues)? Then by all means [submit an issue](https://github.com/mmistakes/minimal-mistakes/issues/new) or [pull request](https://help.github.com/articles/using-pull-requests/). If this is your first pull request, it may be helpful to read up on the [GitHub Flow](https://guides.github.com/introduction/flow/) first. + +Minimal Mistakes has been designed as a base for you to customize and fit your site's unique needs. Please keep this in mind when requesting features and/or submitting pull requests. If it's not something that most people will use, I probably won't consider it. When in doubt ask. + +This goes for author sidebar links and "share button" additions -- I have no intention of merging in every possibly option, the essentials are there to get you started :smile:. + +### Pull Requests + +When submitting a pull request: + +1. Clone the repo. +2. Create a branch off of `master` and give it a meaningful name (e.g. `my-awesome-new-feature`). +3. Open a pull request on GitHub and describe the feature or fix. + +Theme documentation and demo pages can be found in the [`/docs`](docs) if submitting improvements, typo corrections, etc. + +## Development + +To set up your environment to develop this theme, run `bundle install`. + +To test the theme, run `bundle exec rake preview` and open your browser at `http://localhost:4000/test/`. This starts a Jekyll server using content in the `test/` directory. As modifications are made to the theme and test site, it will regenerate and you should see the changes in the browser after a refresh. + +--- + +## Credits + +### Creator + +**Michael Rose** + +- +- +- + +### Icons + Demo Images: + +- [The Noun Project](https://thenounproject.com) -- Garrett Knoll, Arthur Shlain, and [tracy tam](https://thenounproject.com/tracytam) +- [Font Awesome](http://fontawesome.io/) +- [Unsplash](https://unsplash.com/) + +### Other: + +- [Jekyll](http://jekyllrb.com/) +- [jQuery](http://jquery.com/) +- [Susy](http://susy.oddbird.net/) +- [Breakpoint](http://breakpoint-sass.com/) +- [Magnific Popup](http://dimsemenov.com/plugins/magnific-popup/) +- [FitVids.JS](http://fitvidsjs.com/) +- [GreedyNav.js](https://github.com/lukejacksonn/GreedyNav) +- [Smooth Scroll](https://github.com/cferdinandi/smooth-scroll) +- [Gumshoe](https://github.com/cferdinandi/gumshoe) +- [jQuery throttle / debounce](http://benalman.com/projects/jquery-throttle-debounce-plugin/) +- [Lunr](http://lunrjs.com) + +--- + +## License + +The MIT License (MIT) + +Copyright (c) 2013-2020 Michael Rose and contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +Minimal Mistakes incorporates icons from [The Noun Project](https://thenounproject.com/) +creators Garrett Knoll, Arthur Shlain, and tracy tam. +Icons are distributed under Creative Commons Attribution 3.0 United States (CC BY 3.0 US). + +Minimal Mistakes incorporates [Font Awesome](http://fontawesome.io/), +Copyright (c) 2017 Dave Gandy. +Font Awesome is distributed under the terms of the [SIL OFL 1.1](http://scripts.sil.org/OFL) +and [MIT License](http://opensource.org/licenses/MIT). + +Minimal Mistakes incorporates photographs from [Unsplash](https://unsplash.com). + +Minimal Mistakes incorporates [Susy](http://susy.oddbird.net/), +Copyright (c) 2017, Miriam Eric Suzanne. +Susy is distributed under the terms of the [BSD 3-clause "New" or "Revised" License](https://opensource.org/licenses/BSD-3-Clause). + +Minimal Mistakes incorporates [Breakpoint](http://breakpoint-sass.com/). +Breakpoint is distributed under the terms of the [MIT/GPL Licenses](http://opensource.org/licenses/MIT). + +Minimal Mistakes incorporates [FitVids.js](https://github.com/davatron5000/FitVids.js/), +Copyright (c) 2013 Dave Rubert and Chris Coyier. +FitVids is distributed under the terms of the [WTFPL License](http://www.wtfpl.net/). + +Minimal Mistakes incorporates [Magnific Popup](http://dimsemenov.com/plugins/magnific-popup/), +Copyright (c) 2014-2016 Dmitry Semenov, http://dimsemenov.com. +Magnific Popup is distributed under the terms of the MIT License. + +Minimal Mistakes incorporates [Smooth Scroll](http://github.com/cferdinandi/smooth-scroll), +Copyright (c) 2019 Chris Ferdinandi. +Smooth Scroll is distributed under the terms of the [MIT License](http://opensource.org/licenses/MIT). + +Minimal Mistakes incorporates [Gumshoejs](http://github.com/cferdinandi/gumshoe), +Copyright (c) 2019 Chris Ferdinandi. +Smooth Scroll is distributed under the terms of the [MIT License](http://opensource.org/licenses/MIT). + +Minimal Mistakes incorporates [jQuery throttle / debounce](http://benalman.com/projects/jquery-throttle-debounce-plugin/), +Copyright (c) 2010 "Cowboy" Ben Alman. +jQuery throttle / debounce is distributed under the terms of the [MIT License](http://opensource.org/licenses/MIT). + +Minimal Mistakes incorporates [GreedyNav.js](https://github.com/lukejacksonn/GreedyNav), +Copyright (c) 2015 Luke Jackson. +GreedyNav.js is distributed under the terms of the [MIT License](http://opensource.org/licenses/MIT). + +Minimal Mistakes incorporates [Jekyll Group-By-Array](https://github.com/mushishi78/jekyll-group-by-array), +Copyright (c) 2015 Max White . +Jekyll Group-By-Array is distributed under the terms of the [MIT License](http://opensource.org/licenses/MIT). + +Minimal Mistakes incorporates [@allejo's Pure Liquid Jekyll Table of Contents](https://allejo.io/blog/a-jekyll-toc-in-liquid-only/), +Copyright (c) 2017 Vladimir Jimenez. +Pure Liquid Jekyll Table of Contents is distributed under the terms of the [MIT License](http://opensource.org/licenses/MIT). + +Minimal Mistakes incorporates [Lunr](http://lunrjs.com), +Copyright (c) 2018 Oliver Nightingale. +Lunr is distributed under the terms of the [MIT License](http://opensource.org/licenses/MIT). diff --git a/favicon-16x16.png b/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..6bb2b34beaea92f31ba6d58e25aff949c62095db GIT binary patch literal 1038 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a><4dIT$I* zN(k-PvE#*y7wgxrfB5iWK|z544r%REL*qlG>K3$3{|#OX4sO>ye)%iOB$22CP#Z` z*X-G|@87@w@83UO0d6rVQE?GLaX}7IVO~)Yehv;cF)?v2F0Si;j~{2woayT7nvs#QX3ZK?6O;DVmbGhEuUoh7$B!Qo5fLpdEro@JSFc_@efsp5 zFJJcTOQ`_HqDV=QUocDb<==m9rL({KkbCLzjhA1mp1$TjF1&3SP@XZ#+uensgH_f8 z$YC$>^mS!_&d$i9YjEcCj{>03b59q?5Q)pl2?;4lVuFIA!i-E}VP<7)ZhQj4F-{>a zE9Qm4-*r@LW05qLxZnhxN_+l<0(Urm#F3WMzI^|}*}%=h#@gP}*6Qx! z=IYFnl=S$Ku+Zd5!9kZDm=?X1oEdr3a%bgF)>Z{w*OfcptHiCLk@>eIP(yfCNJL3cV!1*=QGQxxPO3slWkIS!W2I`Q&6e6=(&6r>mdKI;Vst0Pgp^VgLXD literal 0 HcmV?d00001 diff --git a/favicon-32x32.png b/favicon-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..095d85da7efa4ed90f492c1715c372ace212d8ac GIT binary patch literal 1700 zcmV;V23z@wP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 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 Install now" - url: "/start/" + overlay_image: /assets/images/Banner.png + overlay_filter: rgba(255, 255, 255, 0.8) excerpt: > Automatically Discovering Fast Parallelization Strategies for Distributed Deep Neural Network Training
- GitHub + feature_row: - - title: "Flexible Parallelization" - excerpt: "FlexFlow supports parallelizing DNN training through combinations of the Sample, Operator, Attribute, and Parameter dimensions." - url: "https://cs.stanford.edu/~zhihao/papers/sysml19a.pdf" - btn_class: "btn--primary" - btn_label: "Learn more" - title: "Joint Optimization" excerpt: "FlexFlow uses a novel hierarchical search algorithm to jointly optimize algebraic transformations and parallelization while maintaining scalability." url: "https://www.cs.cmu.edu/~zhihaoj2/papers/unity_osdi22.pdf" btn_class: "btn--primary" + btn_label: "Learn more" + - title: "Flexible Parallelization" + excerpt: "FlexFlow supports parallelizing DNN training through combinations of the Sample, Operator, Attribute, and Parameter dimensions." + url: "https://cs.stanford.edu/~zhihao/papers/sysml19a.pdf" + btn_class: "btn--primary" btn_label: "Learn more" - title: "Speculative Inference" excerpt: "FlexFlow accelerates generative LLM inference with speculative inference and token tree verification." url: "/specInfer/" btn_class: "btn--primary" - btn_label: "Learn more" + btn_label: "Learn more" + --- +
+ +FlexFlow is a DNN framework that automatically discovers fast parallelization strategies for distributed DNN training. +FlexFlow generalizes and goes beyond today's manually designed parallelization strategies (e.g., data and model parallelism) for distributed DNN training by exploring parallelization opportunities across different Samples, Operators, Attributes, and Parameters. + +FlexFlow includes a novel execution simulator to evaluate the runtime performance of different strategies and uses an automated search algorithm to discover highly optimized strategies, which generally outperform today's manually designed strategies. + {% include feature_row %} + +
+ diff --git a/mstile-150x150.png b/mstile-150x150.png new file mode 100644 index 0000000000000000000000000000000000000000..6aad5af5966f1def8726fc1a0f7beda5b0566301 GIT binary patch literal 3700 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 + + + +Created by potrace 1.14, written by Peter Selinger 2001-2017 + + + + + diff --git a/site.webmanifest b/site.webmanifest new file mode 100644 index 00000000..8af025f7 --- /dev/null +++ b/site.webmanifest @@ -0,0 +1,14 @@ +{ + "name": "", + "short_name": "", + "icons": [ + { + "src": "/android-chrome-144x144.png", + "sizes": "144x144", + "type": "image/png" + } + ], + "theme_color": "#ffffff", + "background_color": "#ffffff", + "display": "standalone" +}