mirror of
https://github.com/deepspeedai/DeepSpeed.git
synced 2025-10-20 15:33:51 +08:00
Website posts and tutorial improvements (#1799)
Co-authored-by: Jeff Rasley <jerasley@microsoft.com>
This commit is contained in:
@ -5,6 +5,7 @@ description: >-
|
|||||||
training easy, efficient, and effective.
|
training easy, efficient, and effective.
|
||||||
|
|
||||||
locale : "en-US"
|
locale : "en-US"
|
||||||
|
logo: /assets/images/deepspeed-logo-uppercase-bold-white-1.15.svg
|
||||||
|
|
||||||
repository: microsoft/DeepSpeed
|
repository: microsoft/DeepSpeed
|
||||||
baseurl: "/" # the subpath of your site, e.g. /blog
|
baseurl: "/" # the subpath of your site, e.g. /blog
|
||||||
@ -13,6 +14,7 @@ url: "https://www.deepspeed.ai" # the base hostname & protocol for your site, e.
|
|||||||
# Build settings
|
# Build settings
|
||||||
remote_theme: "mmistakes/minimal-mistakes@4.19.0"
|
remote_theme: "mmistakes/minimal-mistakes@4.19.0"
|
||||||
minimal_mistakes_skin : "air"
|
minimal_mistakes_skin : "air"
|
||||||
|
search: true
|
||||||
|
|
||||||
plugins:
|
plugins:
|
||||||
- jekyll-feed
|
- jekyll-feed
|
||||||
@ -45,6 +47,7 @@ collections:
|
|||||||
- megatron.md
|
- megatron.md
|
||||||
- mixture-of-experts.md
|
- mixture-of-experts.md
|
||||||
- mixture-of-experts-nlg.md
|
- mixture-of-experts-nlg.md
|
||||||
|
- mixture-of-experts-inference.md
|
||||||
- one-cycle.md
|
- one-cycle.md
|
||||||
- onebit-adam.md
|
- onebit-adam.md
|
||||||
- zero-one-adam.md
|
- zero-one-adam.md
|
||||||
@ -79,8 +82,23 @@ defaults:
|
|||||||
path: ""
|
path: ""
|
||||||
type: posts
|
type: posts
|
||||||
values:
|
values:
|
||||||
layout: single
|
layout: single-full
|
||||||
|
author_profile: false
|
||||||
|
read_time: false
|
||||||
|
comments: false
|
||||||
share: true
|
share: true
|
||||||
|
related: false
|
||||||
|
toc: true
|
||||||
|
toc_label: "Contents"
|
||||||
|
toc_sticky: true
|
||||||
|
show_date: true
|
||||||
|
- scope:
|
||||||
|
path: ""
|
||||||
|
type: tutorials
|
||||||
|
values:
|
||||||
|
layout: single
|
||||||
|
toc_sticky: true
|
||||||
|
|
||||||
|
|
||||||
analytics:
|
analytics:
|
||||||
provider: "google-gtag"
|
provider: "google-gtag"
|
||||||
|
@ -1,122 +1,124 @@
|
|||||||
main:
|
main:
|
||||||
- title: "Getting Started"
|
- title: 'Getting Started'
|
||||||
url: /getting-started/
|
url: /getting-started/
|
||||||
- title: "News"
|
- title: 'Blog'
|
||||||
url: /news/
|
url: /posts/
|
||||||
- title: "Tutorials"
|
- title: 'Tutorials'
|
||||||
url: /tutorials/
|
url: /tutorials/
|
||||||
- title: "Documentation"
|
- title: 'Documentation'
|
||||||
url: https://deepspeed.readthedocs.io/
|
url: https://deepspeed.readthedocs.io/
|
||||||
- title: "GitHub"
|
- title: 'GitHub'
|
||||||
url: https://github.com/microsoft/DeepSpeed
|
url: https://github.com/microsoft/DeepSpeed
|
||||||
|
|
||||||
lnav:
|
lnav:
|
||||||
- title: "Feature Overview"
|
- title: 'Feature Overview'
|
||||||
url: /features/
|
url: /features/
|
||||||
- title: "Getting Started"
|
- title: 'Getting Started'
|
||||||
url: /getting-started/
|
url: /getting-started/
|
||||||
children:
|
children:
|
||||||
- title: "Installation"
|
- title: 'Installation'
|
||||||
url: /getting-started/#installation
|
url: /getting-started/#installation
|
||||||
- title: "Writing models"
|
- title: 'Writing models'
|
||||||
url: /getting-started/#writing-deepspeed-models
|
url: /getting-started/#writing-deepspeed-models
|
||||||
- title: "Training"
|
- title: 'Training'
|
||||||
url: /getting-started/#training
|
url: /getting-started/#training
|
||||||
- title: "Launching"
|
- title: 'Launching'
|
||||||
url: /getting-started/#launching-deepspeed-training
|
url: /getting-started/#launching-deepspeed-training
|
||||||
- title: "Configuration"
|
- title: 'Configuration'
|
||||||
url: /docs/config-json/
|
url: /docs/config-json/
|
||||||
children:
|
children:
|
||||||
- title: "Autotuning"
|
- title: 'Autotuning'
|
||||||
url: /docs/config-json/#autotuning
|
url: /docs/config-json/#autotuning
|
||||||
- title: "Batch size"
|
- title: 'Batch size'
|
||||||
url: /docs/config-json/#batch-size-related-parameters
|
url: /docs/config-json/#batch-size-related-parameters
|
||||||
- title: "Optimizer"
|
- title: 'Optimizer'
|
||||||
url: /docs/config-json/#optimizer-parameters
|
url: /docs/config-json/#optimizer-parameters
|
||||||
- title: "Scheduler"
|
- title: 'Scheduler'
|
||||||
url: /docs/config-json/#scheduler-parameters
|
url: /docs/config-json/#scheduler-parameters
|
||||||
- title: "Communication"
|
- title: 'Communication'
|
||||||
url: /docs/config-json/#communication-options
|
url: /docs/config-json/#communication-options
|
||||||
- title: "FP16"
|
- title: 'FP16'
|
||||||
url: /docs/config-json/#fp16-training-options
|
url: /docs/config-json/#fp16-training-options
|
||||||
- title: "BFOAT16"
|
- title: 'BFLOAT16'
|
||||||
url: /docs/config-json/#bfloat16-training-options
|
url: /docs/config-json/#bfloat16-training-options
|
||||||
- title: "Gradient Clipping"
|
- title: 'Gradient Clipping'
|
||||||
url: /docs/config-json/#gradient-clipping
|
url: /docs/config-json/#gradient-clipping
|
||||||
- title: "ZeRO optimizations"
|
- title: 'ZeRO optimizations'
|
||||||
url: /docs/config-json/#zero-optimizations-for-fp16-training
|
url: /docs/config-json/#zero-optimizations-for-fp16-training
|
||||||
- title: "Parameter Offloading"
|
- title: 'Parameter Offloading'
|
||||||
url: /docs/config-json/#parameter-offloading
|
url: /docs/config-json/#parameter-offloading
|
||||||
- title: "Optimizer Offloading"
|
- title: 'Optimizer Offloading'
|
||||||
url: /docs/config-json/#optimizer-offloading
|
url: /docs/config-json/#optimizer-offloading
|
||||||
- title: "Asynchronous I/O"
|
- title: 'Asynchronous I/O'
|
||||||
url: /docs/config-json/#asynchronous-io
|
url: /docs/config-json/#asynchronous-io
|
||||||
- title: "Logging"
|
- title: 'Logging'
|
||||||
url: /docs/config-json/#logging
|
url: /docs/config-json/#logging
|
||||||
- title: "Flops Profiler"
|
- title: 'Flops Profiler'
|
||||||
url: /docs/config-json/#flops-profiler
|
url: /docs/config-json/#flops-profiler
|
||||||
- title: "PyTorch Profiler"
|
- title: 'PyTorch Profiler'
|
||||||
url: /docs/config-json/#pytorch-profiler
|
url: /docs/config-json/#pytorch-profiler
|
||||||
- title: "Activation checkpointing"
|
- title: 'Activation checkpointing'
|
||||||
url: /docs/config-json/#activation-checkpointing
|
url: /docs/config-json/#activation-checkpointing
|
||||||
- title: "Sparse Attention"
|
- title: 'Sparse Attention'
|
||||||
url: /docs/config-json/#sparse-attention
|
url: /docs/config-json/#sparse-attention
|
||||||
- title: "Logging to TensorBoard"
|
- title: 'Logging to TensorBoard'
|
||||||
url: /docs/config-json/#tensorboard-options
|
url: /docs/config-json/#tensorboard-options
|
||||||
- title: "Tutorials"
|
- title: 'Tutorials'
|
||||||
url: /tutorials/
|
url: /tutorials/
|
||||||
children:
|
children:
|
||||||
- title: "Getting started"
|
- title: 'Getting started'
|
||||||
url: /getting-started/
|
url: /getting-started/
|
||||||
- title: "Getting started on Azure"
|
- title: 'Getting started on Azure'
|
||||||
url: /tutorials/azure/
|
url: /tutorials/azure/
|
||||||
- title: "Autotuning"
|
- title: 'Autotuning'
|
||||||
url: /tutorials/autotuning/
|
url: /tutorials/autotuning/
|
||||||
- title: "BingBertSQuAD Fine-tuning"
|
- title: 'BingBertSQuAD Fine-tuning'
|
||||||
url: /tutorials/bert-finetuning/
|
url: /tutorials/bert-finetuning/
|
||||||
- title: "BERT Pre-training"
|
- title: 'BERT Pre-training'
|
||||||
url: /tutorials/bert-pretraining/
|
url: /tutorials/bert-pretraining/
|
||||||
- title: "CIFAR-10"
|
- title: 'CIFAR-10'
|
||||||
url: /tutorials/cifar-10/
|
url: /tutorials/cifar-10/
|
||||||
- title: "Curriculum Learning"
|
- title: 'Curriculum Learning'
|
||||||
url: /tutorials/curriculum-learning/
|
url: /tutorials/curriculum-learning/
|
||||||
- title: "Flops Profiler"
|
- title: 'Flops Profiler'
|
||||||
url: /tutorials/flops-profiler/
|
url: /tutorials/flops-profiler/
|
||||||
- title: "PyTorch Profiler"
|
- title: 'PyTorch Profiler'
|
||||||
url: /tutorials/pytorch-profiler/
|
url: /tutorials/pytorch-profiler/
|
||||||
- title: "GAN"
|
- title: 'GAN'
|
||||||
url: /tutorials/gan/
|
url: /tutorials/gan/
|
||||||
- title: "Inference"
|
- title: 'Inference'
|
||||||
url: /tutorials/inference-tutorial/
|
url: /tutorials/inference-tutorial/
|
||||||
- title: "Learning Rate Range Test"
|
- title: 'Learning Rate Range Test'
|
||||||
url: /tutorials/lrrt/
|
url: /tutorials/lrrt/
|
||||||
- title: "Megatron-LM GPT2"
|
- title: 'Megatron-LM GPT2'
|
||||||
url: /tutorials/megatron/
|
url: /tutorials/megatron/
|
||||||
- title: "Mixture-of-Experts (MoE)"
|
- title: 'Mixture-of-Experts (MoE)'
|
||||||
url: /tutorials/mixture-of-experts/
|
url: /tutorials/mixture-of-experts/
|
||||||
- title: "Mixture-of-Experts for NLG"
|
- title: 'MoE for NLG'
|
||||||
url: /tutorials/mixture-of-experts-nlg/
|
url: /tutorials/mixture-of-experts-nlg/
|
||||||
- title: "Mixture-of-Quantization"
|
- title: 'MoE Inference'
|
||||||
|
url: /tutorials/mixture-of-experts-inference/
|
||||||
|
- title: 'Mixture-of-Quantization'
|
||||||
url: /tutorials/MoQ-tutorial/
|
url: /tutorials/MoQ-tutorial/
|
||||||
- title: "One-Cycle Schedule"
|
- title: 'One-Cycle Schedule'
|
||||||
url: /tutorials/one-cycle/
|
url: /tutorials/one-cycle/
|
||||||
- title: "One-Bit Adam"
|
- title: 'One-Bit Adam'
|
||||||
url: /tutorials/onebit-adam/
|
url: /tutorials/onebit-adam/
|
||||||
- title: "Zero-One Adam"
|
- title: "Zero-One Adam"
|
||||||
url: /tutorials/zero-one-adam/
|
url: /tutorials/zero-one-adam/
|
||||||
- title: "One-Bit LAMB"
|
- title: "One-Bit LAMB"
|
||||||
url: /tutorials/onebit-lamb/
|
url: /tutorials/onebit-lamb/
|
||||||
- title: "Pipeline Parallelism"
|
- title: 'Pipeline Parallelism'
|
||||||
url: /tutorials/pipeline/
|
url: /tutorials/pipeline/
|
||||||
- title: "Progressive Layer Dropping"
|
- title: 'Progressive Layer Dropping'
|
||||||
url: /tutorials/progressive_layer_dropping/
|
url: /tutorials/progressive_layer_dropping/
|
||||||
- title: "Sparse Attention"
|
- title: 'Sparse Attention'
|
||||||
url: /tutorials/sparse-attention/
|
url: /tutorials/sparse-attention/
|
||||||
- title: "Transformer Kernel"
|
- title: 'Transformer Kernel'
|
||||||
url: /tutorials/transformer_kernel/
|
url: /tutorials/transformer_kernel/
|
||||||
- title: "ZeRO-Offload"
|
- title: 'ZeRO-Offload'
|
||||||
url: /tutorials/zero-offload/
|
url: /tutorials/zero-offload/
|
||||||
- title: "ZeRO Redundancy Optimizer (ZeRO)"
|
- title: 'ZeRO'
|
||||||
url: /tutorials/zero/
|
url: /tutorials/zero/
|
||||||
- title: "Contributing"
|
- title: 'Contributing'
|
||||||
url: /contributing/
|
url: /contributing/
|
||||||
|
14
docs/_includes/analytics.html
Normal file
14
docs/_includes/analytics.html
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
{% if jekyll.environment == 'production' and site.analytics.provider and page.analytics != false %}
|
||||||
|
|
||||||
|
{% case site.analytics.provider %}
|
||||||
|
{% when "google" %}
|
||||||
|
{% include /analytics-providers/google.html %}
|
||||||
|
{% when "google-universal" %}
|
||||||
|
{% include /analytics-providers/google-universal.html %}
|
||||||
|
{% when "google-gtag" %}
|
||||||
|
{% include /analytics-providers/google-gtag.html %}
|
||||||
|
{% when "custom" %}
|
||||||
|
{% include /analytics-providers/custom.html %}
|
||||||
|
{% endcase %}
|
||||||
|
|
||||||
|
{% endif %}
|
30
docs/_includes/archive-single.html
Normal file
30
docs/_includes/archive-single.html
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
{% if post.header.teaser %}
|
||||||
|
{% capture teaser %}{{ post.header.teaser }}{% endcapture %}
|
||||||
|
{% else %}
|
||||||
|
{% assign teaser = site.teaser %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if post.id %}
|
||||||
|
{% assign title = post.title | markdownify | remove: "<p>" | remove: "</p>" %}
|
||||||
|
{% else %}
|
||||||
|
{% assign title = post.title %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<div class="{{ include.type | default: 'list' }}__item">
|
||||||
|
<article class="archive__item" itemscope itemtype="https://schema.org/CreativeWork">
|
||||||
|
{% if include.type == "grid" and teaser %}
|
||||||
|
<div class="archive__item-teaser">
|
||||||
|
<img src="{{ teaser | relative_url }}" alt="">
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
<h2 class="archive__item-title no_toc" itemprop="headline">
|
||||||
|
{% if post.link %}
|
||||||
|
<a href="{{ post.link }}">{{ title }}</a> <a href="{{ post.url | relative_url }}" rel="permalink"><i class="fas fa-link" aria-hidden="true" title="permalink"></i><span class="sr-only">Permalink</span></a>
|
||||||
|
{% else %}
|
||||||
|
<a href="{{ post.url | relative_url }}" rel="permalink">{{ title }}</a>
|
||||||
|
{% endif %}
|
||||||
|
</h2>
|
||||||
|
{% include page__meta.html type=include.type %}
|
||||||
|
{% if post.excerpt %}<p class="archive__item-excerpt" itemprop="description">{{ post.excerpt | markdownify | strip_html | truncate: 160 }}</p>{% endif %}
|
||||||
|
</article>
|
||||||
|
</div>
|
7
docs/_includes/author-profile-custom-links.html
Normal file
7
docs/_includes/author-profile-custom-links.html
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
<!--
|
||||||
|
<li>
|
||||||
|
<a href="http://link-to-whatever-social-network.com/user/" itemprop="sameAs" rel="nofollow noopener noreferrer">
|
||||||
|
<i class="fas fa-fw" aria-hidden="true"></i> Custom Social Profile Link
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
-->
|
252
docs/_includes/author-profile.html
Normal file
252
docs/_includes/author-profile.html
Normal file
@ -0,0 +1,252 @@
|
|||||||
|
{% assign author = page.author | default: page.authors[0] | default: site.author %}
|
||||||
|
{% assign author = site.data.authors[author] | default: author %}
|
||||||
|
|
||||||
|
<div itemscope itemtype="https://schema.org/Person">
|
||||||
|
|
||||||
|
{% if author.avatar %}
|
||||||
|
<div class="author__avatar">
|
||||||
|
{% if author.home %}
|
||||||
|
<a href="{{ author.home | relative_url }}">
|
||||||
|
<img src="{{ author.avatar | relative_url }}" alt="{{ author.name }}" itemprop="image">
|
||||||
|
</a>
|
||||||
|
{% else %}
|
||||||
|
<img src="{{ author.avatar | relative_url }}" alt="{{ author.name }}" itemprop="image">
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<div class="author__content">
|
||||||
|
{% if author.home %}
|
||||||
|
<a href="{{ author.home | relative_url }}"><h3 class="author__name" itemprop="name">{{ author.name }}</h3></a>
|
||||||
|
{% else %}
|
||||||
|
<h3 class="author__name" itemprop="name">{{ author.name }}</h3>
|
||||||
|
{% endif %}
|
||||||
|
{% if author.bio %}
|
||||||
|
<div class="author__bio" itemprop="description">
|
||||||
|
{{ author.bio | markdownify }}
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="author__urls-wrapper">
|
||||||
|
<button class="btn btn--inverse">{{ site.data.ui-text[site.locale].follow_label | remove: ":" | default: "Follow" }}</button>
|
||||||
|
<ul class="author__urls social-icons">
|
||||||
|
{% if author.location %}
|
||||||
|
<li itemprop="homeLocation" itemscope itemtype="https://schema.org/Place">
|
||||||
|
<i class="fas fa-fw fa-map-marker-alt" aria-hidden="true"></i> <span itemprop="name">{{ author.location }}</span>
|
||||||
|
</li>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if author.links %}
|
||||||
|
{% for link in author.links %}
|
||||||
|
{% if link.label and link.url %}
|
||||||
|
<li><a href="{{ link.url }}" rel="nofollow noopener noreferrer"><i class="{{ link.icon | default: 'fas fa-link' }}" aria-hidden="true"></i><span class="label">{{ link.label }}</span></a></li>
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if author.uri %}
|
||||||
|
<li>
|
||||||
|
<a href="{{ author.uri }}" itemprop="url">
|
||||||
|
<i class="fas fa-fw fa-link" aria-hidden="true"></i><span class="label">{{ site.data.ui-text[site.locale].website_label | default: "Website" }}</span>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if author.email %}
|
||||||
|
<li>
|
||||||
|
<a href="mailto:{{ author.email }}">
|
||||||
|
<meta itemprop="email" content="{{ author.email }}" />
|
||||||
|
<i class="fas fa-fw fa-envelope-square" aria-hidden="true"></i><span class="label">{{ site.data.ui-text[site.locale].email_label | default: "Email" }}</span>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if author.keybase %}
|
||||||
|
<li>
|
||||||
|
<a href="https://keybase.io/{{ author.keybase }}" itemprop="sameAs" rel="nofollow noopener noreferrer">
|
||||||
|
<i class="fas fa-fw fa-key" aria-hidden="true"></i><span class="label">Keybase</span>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if author.twitter %}
|
||||||
|
<li>
|
||||||
|
<a href="https://twitter.com/{{ author.twitter }}" itemprop="sameAs" rel="nofollow noopener noreferrer">
|
||||||
|
<i class="fab fa-fw fa-twitter-square" aria-hidden="true"></i><span class="label">Twitter</span>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if author.facebook %}
|
||||||
|
<li>
|
||||||
|
<a href="https://www.facebook.com/{{ author.facebook }}" itemprop="sameAs" rel="nofollow noopener noreferrer">
|
||||||
|
<i class="fab fa-fw fa-facebook-square" aria-hidden="true"></i><span class="label">Facebook</span>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if author.linkedin %}
|
||||||
|
<li>
|
||||||
|
<a href="https://www.linkedin.com/in/{{ author.linkedin }}" itemprop="sameAs" rel="nofollow noopener noreferrer">
|
||||||
|
<i class="fab fa-fw fa-linkedin" aria-hidden="true"></i><span class="label">LinkedIn</span>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if author.xing %}
|
||||||
|
<li>
|
||||||
|
<a href="https://www.xing.com/profile/{{ author.xing }}" itemprop="sameAs" rel="nofollow noopener noreferrer">
|
||||||
|
<i class="fab fa-fw fa-xing-square" aria-hidden="true"></i><span class="label">XING</span>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if author.instagram %}
|
||||||
|
<li>
|
||||||
|
<a href="https://instagram.com/{{ author.instagram }}" itemprop="sameAs" rel="nofollow noopener noreferrer">
|
||||||
|
<i class="fab fa-fw fa-instagram" aria-hidden="true"></i><span class="label">Instagram</span>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if author.tumblr %}
|
||||||
|
<li>
|
||||||
|
<a href="https://{{ author.tumblr }}.tumblr.com" itemprop="sameAs" rel="nofollow noopener noreferrer">
|
||||||
|
<i class="fab fa-fw fa-tumblr-square" aria-hidden="true"></i><span class="label">Tumblr</span>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if author.bitbucket %}
|
||||||
|
<li>
|
||||||
|
<a href="https://bitbucket.org/{{ author.bitbucket }}" itemprop="sameAs" rel="nofollow noopener noreferrer">
|
||||||
|
<i class="fab fa-fw fa-bitbucket" aria-hidden="true"></i><span class="label">Bitbucket</span>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if author.github %}
|
||||||
|
<li>
|
||||||
|
<a href="https://github.com/{{ author.github }}" itemprop="sameAs" rel="nofollow noopener noreferrer">
|
||||||
|
<i class="fab fa-fw fa-github" aria-hidden="true"></i><span class="label">GitHub</span>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if author.gitlab %}
|
||||||
|
<li>
|
||||||
|
<a href="https://gitlab.com/{{ author.gitlab }}" itemprop="sameAs" rel="nofollow noopener noreferrer">
|
||||||
|
<i class="fab fa-fw fa-gitlab" aria-hidden="true"></i><span class="label">GitLab</span>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if author.stackoverflow %}
|
||||||
|
<li>
|
||||||
|
<a href="https://stackoverflow.com/users/{{ author.stackoverflow }}" itemprop="sameAs" rel="nofollow noopener noreferrer">
|
||||||
|
<i class="fab fa-fw fa-stack-overflow" aria-hidden="true"></i><span class="label">Stack Overflow</span>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if author.lastfm %}
|
||||||
|
<li>
|
||||||
|
<a href="https://last.fm/user/{{ author.lastfm }}" itemprop="sameAs" rel="nofollow noopener noreferrer">
|
||||||
|
<i class="fab fa-fw fa-lastfm-square" aria-hidden="true"></i><span class="label">Last.fm</span>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if author.dribbble %}
|
||||||
|
<li>
|
||||||
|
<a href="https://dribbble.com/{{ author.dribbble }}" itemprop="sameAs" rel="nofollow noopener noreferrer">
|
||||||
|
<i class="fab fa-fw fa-dribbble" aria-hidden="true"></i><span class="label">Dribbble</span>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if author.pinterest %}
|
||||||
|
<li>
|
||||||
|
<a href="https://www.pinterest.com/{{ author.pinterest }}" itemprop="sameAs" rel="nofollow noopener noreferrer">
|
||||||
|
<i class="fab fa-fw fa-pinterest" aria-hidden="true"></i><span class="label">Pinterest</span>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if author.foursquare %}
|
||||||
|
<li>
|
||||||
|
<a href="https://foursquare.com/{{ author.foursquare }}" itemprop="sameAs" rel="nofollow noopener noreferrer">
|
||||||
|
<i class="fab fa-fw fa-foursquare" aria-hidden="true"></i><span class="label">Foursquare</span>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if author.steam %}
|
||||||
|
<li>
|
||||||
|
<a href="https://steamcommunity.com/id/{{ author.steam }}" itemprop="sameAs" rel="nofollow noopener noreferrer">
|
||||||
|
<i class="fab fa-fw fa-steam" aria-hidden="true"></i><span class="label">Steam</span>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if author.youtube %}
|
||||||
|
{% if author.youtube contains "://" %}
|
||||||
|
<li>
|
||||||
|
<a href="{{ author.youtube }}" itemprop="sameAs" rel="nofollow noopener noreferrer">
|
||||||
|
<i class="fab fa-fw fa-youtube" aria-hidden="true"></i><span class="label">YouTube</span>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
{% elsif author.youtube %}
|
||||||
|
<li>
|
||||||
|
<a href="https://www.youtube.com/user/{{ author.youtube }}" itemprop="sameAs" rel="nofollow noopener noreferrer">
|
||||||
|
<i class="fab fa-fw fa-youtube" aria-hidden="true"></i><span class="label">YouTube</span>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if author.soundcloud %}
|
||||||
|
<li>
|
||||||
|
<a href="https://soundcloud.com/{{ author.soundcloud }}" itemprop="sameAs" rel="nofollow noopener noreferrer">
|
||||||
|
<i class="fab fa-fw fa-soundcloud" aria-hidden="true"></i><span class="label">SoundCloud</span>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if author.weibo %}
|
||||||
|
<li>
|
||||||
|
<a href="https://www.weibo.com/{{ author.weibo }}" itemprop="sameAs" rel="nofollow noopener noreferrer">
|
||||||
|
<i class="fab fa-fw fa-weibo" aria-hidden="true"></i><span class="label">Weibo</span>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if author.flickr %}
|
||||||
|
<li>
|
||||||
|
<a href="https://www.flickr.com/{{ author.flickr }}" itemprop="sameAs" rel="nofollow noopener noreferrer">
|
||||||
|
<i class="fab fa-fw fa-flickr" aria-hidden="true"></i><span class="label">Flickr</span>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if author.codepen %}
|
||||||
|
<li>
|
||||||
|
<a href="https://codepen.io/{{ author.codepen }}" itemprop="sameAs" rel="nofollow noopener noreferrer">
|
||||||
|
<i class="fab fa-fw fa-codepen" aria-hidden="true"></i><span class="label">CodePen</span>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if author.vine %}
|
||||||
|
<li>
|
||||||
|
<a href="https://vine.co/u/{{ author.vine }}" itemprop="sameAs" rel="nofollow noopener noreferrer">
|
||||||
|
<i class="fab fa-fw fa-vine" aria-hidden="true"></i><span class="label">{{ site.data.ui-text[site.locale].email_label | default: "Email" }}</span>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% include author-profile-custom-links.html %}
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
39
docs/_includes/breadcrumbs.html
Normal file
39
docs/_includes/breadcrumbs.html
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
{% case site.category_archive.type %}
|
||||||
|
{% when "liquid" %}
|
||||||
|
{% assign path_type = "#" %}
|
||||||
|
{% when "jekyll-archives" %}
|
||||||
|
{% assign path_type = nil %}
|
||||||
|
{% endcase %}
|
||||||
|
|
||||||
|
{% if page.collection != 'posts' %}
|
||||||
|
{% assign path_type = nil %}
|
||||||
|
{% assign crumb_path = '/' %}
|
||||||
|
{% else %}
|
||||||
|
{% assign crumb_path = site.category_archive.path %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<nav class="breadcrumbs">
|
||||||
|
<ol itemscope itemtype="https://schema.org/BreadcrumbList">
|
||||||
|
{% assign crumbs = page.url | split: '/' %}
|
||||||
|
{% assign i = 1 %}
|
||||||
|
{% for crumb in crumbs offset: 1 %}
|
||||||
|
{% if forloop.first %}
|
||||||
|
<li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
|
||||||
|
<a href="{{ site.url }}{{ site.baseurl }}/" itemprop="item"><span itemprop="name">{{ site.data.ui-text[site.locale].breadcrumb_home_label | default: "Home" }}</span></a>
|
||||||
|
<meta itemprop="position" content="{{ i }}" />
|
||||||
|
</li>
|
||||||
|
<span class="sep">{{ site.data.ui-text[site.locale].breadcrumb_separator | default: "/" }}</span>
|
||||||
|
{% endif %}
|
||||||
|
{% if forloop.last %}
|
||||||
|
<li class="current">{{ page.title }}</li>
|
||||||
|
{% else %}
|
||||||
|
{% assign i = i | plus: 1 %}
|
||||||
|
<li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
|
||||||
|
<a href="{{ crumb | downcase | replace: '%20', '-' | prepend: path_type | prepend: crumb_path | relative_url }}" itemprop="item"><span itemprop="name">{{ crumb | replace: '-', ' ' | replace: '%20', ' ' | capitalize }}</span></a>
|
||||||
|
<meta itemprop="position" content="{{ i }}" />
|
||||||
|
</li>
|
||||||
|
<span class="sep">{{ site.data.ui-text[site.locale].breadcrumb_separator | default: "/" }}</span>
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
</ol>
|
||||||
|
</nav>
|
3
docs/_includes/browser-upgrade.html
Normal file
3
docs/_includes/browser-upgrade.html
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
<!--[if lt IE 9]>
|
||||||
|
<div class="notice--danger align-center" style="margin: 0;">You are using an <strong>outdated</strong> browser. Please <a href="https://browsehappy.com/">upgrade your browser</a> to improve your experience.</div>
|
||||||
|
<![endif]-->
|
26
docs/_includes/category-list.html
Normal file
26
docs/_includes/category-list.html
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
{% case site.category_archive.type %}
|
||||||
|
{% when "liquid" %}
|
||||||
|
{% assign path_type = "#" %}
|
||||||
|
{% when "jekyll-archives" %}
|
||||||
|
{% assign path_type = nil %}
|
||||||
|
{% endcase %}
|
||||||
|
|
||||||
|
{% if site.category_archive.path %}
|
||||||
|
{% comment %}
|
||||||
|
<!-- Sort alphabetically regardless of case e.g. a B c d E -->
|
||||||
|
<!-- modified from http://www.codeofclimber.ru/2015/sorting-site-tags-in-jekyll/ -->
|
||||||
|
{% endcomment %}
|
||||||
|
{% capture page_categories %}{% for category in page.categories %}{{ category | downcase }}|{{ category }}{% unless forloop.last %},{% endunless %}{% endfor %}{% endcapture %}
|
||||||
|
{% assign category_hashes = page_categories | split: ',' | sort %}
|
||||||
|
|
||||||
|
<p class="page__taxonomy">
|
||||||
|
<strong><i class="fas fa-fw fa-folder-open" aria-hidden="true"></i> {{ site.data.ui-text[site.locale].categories_label | default: "Categories:" }} </strong>
|
||||||
|
<span itemprop="keywords">
|
||||||
|
{% for hash in category_hashes %}
|
||||||
|
{% assign keyValue = hash | split: '|' %}
|
||||||
|
{% capture category_word %}{{ keyValue[1] | strip_newlines }}{% endcapture %}
|
||||||
|
<a href="{{ category_word | slugify | prepend: path_type | prepend: site.category_archive.path | relative_url }}" class="page__taxonomy-item" rel="tag">{{ category_word }}</a>{% unless forloop.last %}<span class="sep">, </span>{% endunless %}
|
||||||
|
{% endfor %}
|
||||||
|
</span>
|
||||||
|
</p>
|
||||||
|
{% endif %}
|
22
docs/_includes/comment.html
Normal file
22
docs/_includes/comment.html
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
<article id="comment{{ include.index }}" class="js-comment comment" itemprop="comment" itemscope itemtype="https://schema.org/Comment">
|
||||||
|
<div class="comment__avatar-wrapper">
|
||||||
|
<img class="comment__avatar" src="https://www.gravatar.com/avatar/{{ include.email }}?d=mm&s=80" alt="{{ include.name }}">
|
||||||
|
</div>
|
||||||
|
<div class="comment__content-wrapper">
|
||||||
|
<h3 class="comment__author" itemprop="author" itemscope itemtype="https://schema.org/Person">
|
||||||
|
{% unless include.url == blank %}
|
||||||
|
<span itemprop="name"><a rel="external nofollow" itemprop="url" href="{{ include.url }}">{{ include.name }}</a></span>
|
||||||
|
{% else %}
|
||||||
|
<span itemprop="name">{{ include.name }}</span>
|
||||||
|
{% endunless %}
|
||||||
|
</h3>
|
||||||
|
<p class="comment__date">
|
||||||
|
{% if include.date %}
|
||||||
|
{% if include.index %}<a href="#comment{{ include.index }}" itemprop="url">{% endif %}
|
||||||
|
<time datetime="{{ include.date | date_to_xmlschema }}" itemprop="datePublished">{{ include.date | date: "%B %-d, %Y at %I:%M %p" }}</time>
|
||||||
|
{% if include.index %}</a>{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
</p>
|
||||||
|
<div itemprop="text">{{ include.message | markdownify }}</div>
|
||||||
|
</div>
|
||||||
|
</article>
|
159
docs/_includes/comments.html
Normal file
159
docs/_includes/comments.html
Normal file
@ -0,0 +1,159 @@
|
|||||||
|
<div class="page__comments">
|
||||||
|
{% capture comments_label %}{{ site.data.ui-text[site.locale].comments_label | default: "Comments" }}{% endcapture %}
|
||||||
|
{% case site.comments.provider %}
|
||||||
|
{% when "discourse" %}
|
||||||
|
<h4 class="page__comments-title">{{ comments_label }}</h4>
|
||||||
|
<section id="discourse-comments"></section>
|
||||||
|
{% when "disqus" %}
|
||||||
|
<h4 class="page__comments-title">{{ comments_label }}</h4>
|
||||||
|
<section id="disqus_thread"></section>
|
||||||
|
{% when "facebook" %}
|
||||||
|
<h4 class="page__comments-title">{{ comments_label }}</h4>
|
||||||
|
<section class="fb-comments" data-href="{{ page.url | absolute_url }}" data-mobile="true" data-num-posts="{{ site.comments.facebook.num_posts | default: 5 }}" data-width="100%" data-colorscheme="{{ site.comments.facebook.colorscheme | default: 'light' }}"></section>
|
||||||
|
{% when "staticman_v2" %}
|
||||||
|
<section id="static-comments">
|
||||||
|
{% if site.repository and site.comments.staticman.branch %}
|
||||||
|
<!-- Start static comments -->
|
||||||
|
<div class="js-comments">
|
||||||
|
{% if site.data.comments[page.slug] %}
|
||||||
|
<h4 class="page__comments-title">{{ site.data.ui-text[site.locale].comments_title | default: "Comments" }}</h4>
|
||||||
|
{% assign comments = site.data.comments[page.slug] | sort %}
|
||||||
|
|
||||||
|
{% for comment in comments %}
|
||||||
|
{% assign email = comment[1].email %}
|
||||||
|
{% assign name = comment[1].name %}
|
||||||
|
{% assign url = comment[1].url %}
|
||||||
|
{% assign date = comment[1].date %}
|
||||||
|
{% assign message = comment[1].message %}
|
||||||
|
{% include comment.html index=forloop.index email=email name=name url=url date=date message=message %}
|
||||||
|
{% endfor %}
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
<!-- End static comments -->
|
||||||
|
|
||||||
|
<!-- Start new comment form -->
|
||||||
|
<div class="page__comments-form">
|
||||||
|
<h4 class="page__comments-title">{{ site.data.ui-text[site.locale].comments_label | default: "Leave a Comment" }}</h4>
|
||||||
|
<p class="small">{{ site.data.ui-text[site.locale].comment_form_info | default: "Your email address will not be published. Required fields are marked" }} <span class="required">*</span></p>
|
||||||
|
<form id="new_comment" class="page__comments-form js-form form" method="post" action="{{ site.comments.staticman.endpoint | default: 'https://api.staticman.net/v2/entry/' }}{{ site.repository }}/{{ site.comments.staticman.branch }}/comments">
|
||||||
|
<div class="form__spinner">
|
||||||
|
<i class="fas fa-spinner fa-spin fa-3x fa-fw"></i>
|
||||||
|
<span class="sr-only">{{ site.data.ui-text[site.locale].loading_label | default: "Loading..." }}</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="comment-form-message">{{ site.data.ui-text[site.locale].comment_form_comment_label | default: "Comment" }} <small class="required">*</small></label>
|
||||||
|
<textarea type="text" rows="3" id="comment-form-message" name="fields[message]" tabindex="1"></textarea>
|
||||||
|
<div class="small help-block"><a href="https://daringfireball.net/projects/markdown/">{{ site.data.ui-text[site.locale].comment_form_md_info | default: "Markdown is supported." }}</a></div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="comment-form-name">{{ site.data.ui-text[site.locale].comment_form_name_label | default: "Name" }} <small class="required">*</small></label>
|
||||||
|
<input type="text" id="comment-form-name" name="fields[name]" tabindex="2" />
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="comment-form-email">{{ site.data.ui-text[site.locale].comment_form_email_label | default: "Email address" }} <small class="required">*</small></label>
|
||||||
|
<input type="email" id="comment-form-email" name="fields[email]" tabindex="3" />
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="comment-form-url">{{ site.data.ui-text[site.locale].comment_form_website_label | default: "Website (optional)" }}</label>
|
||||||
|
<input type="url" id="comment-form-url" name="fields[url]" tabindex="4"/>
|
||||||
|
</div>
|
||||||
|
<div class="form-group hidden" style="display: none;">
|
||||||
|
<input type="hidden" name="options[slug]" value="{{ page.slug }}">
|
||||||
|
<label for="comment-form-location">Not used. Leave blank if you are a human.</label>
|
||||||
|
<input type="text" id="comment-form-location" name="fields[hidden]" autocomplete="off"/>
|
||||||
|
{% if site.reCaptcha.siteKey %}<input type="hidden" name="options[reCaptcha][siteKey]" value="{{ site.reCaptcha.siteKey }}">{% endif %}
|
||||||
|
{% if site.reCaptcha.secret %}<input type="hidden" name="options[reCaptcha][secret]" value="{{ site.reCaptcha.secret }}">{% endif %}
|
||||||
|
</div>
|
||||||
|
<!-- Start comment form alert messaging -->
|
||||||
|
<p class="hidden js-notice">
|
||||||
|
<strong class="js-notice-text"></strong>
|
||||||
|
</p>
|
||||||
|
<!-- End comment form alert messaging -->
|
||||||
|
{% if site.reCaptcha.siteKey %}
|
||||||
|
<div class="form-group">
|
||||||
|
<div class="g-recaptcha" data-sitekey="{{ site.reCaptcha.siteKey }}"></div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
<div class="form-group">
|
||||||
|
<button type="submit" id="comment-form-submit" tabindex="5" class="btn btn--primary btn--large">{{ site.data.ui-text[site.locale].comment_btn_submit | default: "Submit Comment" }}</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
<!-- End new comment form -->
|
||||||
|
{% if site.reCaptcha.siteKey %}<script async src="https://www.google.com/recaptcha/api.js"></script>{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
</section>
|
||||||
|
{% when "staticman" %}
|
||||||
|
<section id="static-comments">
|
||||||
|
{% if site.repository and site.staticman.branch %}
|
||||||
|
<!-- Start static comments -->
|
||||||
|
<div class="js-comments">
|
||||||
|
{% if site.data.comments[page.slug] %}
|
||||||
|
<h4 class="page__comments-title">{{ site.data.ui-text[site.locale].comments_title | default: "Comments" }}</h4>
|
||||||
|
{% assign comments = site.data.comments[page.slug] | sort %}
|
||||||
|
|
||||||
|
{% for comment in comments %}
|
||||||
|
{% assign email = comment[1].email %}
|
||||||
|
{% assign name = comment[1].name %}
|
||||||
|
{% assign url = comment[1].url %}
|
||||||
|
{% assign date = comment[1].date %}
|
||||||
|
{% assign message = comment[1].message %}
|
||||||
|
{% include comment.html index=forloop.index email=email name=name url=url date=date message=message %}
|
||||||
|
{% endfor %}
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
<!-- End static comments -->
|
||||||
|
|
||||||
|
<!-- Start new comment form -->
|
||||||
|
<div class="page__comments-form">
|
||||||
|
<h4 class="page__comments-title">{{ site.data.ui-text[site.locale].comments_label | default: "Leave a Comment" }}</h4>
|
||||||
|
<p class="small">{{ site.data.ui-text[site.locale].comment_form_info | default: "Your email address will not be published. Required fields are marked" }} <span class="required">*</span></p>
|
||||||
|
<form id="new_comment" class="page__comments-form js-form form" method="post" action="https://api.staticman.net/v1/entry/{{ site.repository }}/{{ site.staticman.branch }}">
|
||||||
|
<div class="form__spinner">
|
||||||
|
<i class="fas fa-spinner fa-spin fa-3x fa-fw"></i>
|
||||||
|
<span class="sr-only">{{ site.data.ui-text[site.locale].loading_label | default: "Loading..." }}</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="comment-form-message">{{ site.data.ui-text[site.locale].comment_form_comment_label | default: "Comment" }} <small class="required">*</small></label>
|
||||||
|
<textarea type="text" rows="3" id="comment-form-message" name="fields[message]" tabindex="1"></textarea>
|
||||||
|
<div class="small help-block"><a href="https://daringfireball.net/projects/markdown/">{{ site.data.ui-text[site.locale].comment_form_md_info | default: "Markdown is supported." }}</a></div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="comment-form-name">{{ site.data.ui-text[site.locale].comment_form_name_label | default: "Name" }} <small class="required">*</small></label>
|
||||||
|
<input type="text" id="comment-form-name" name="fields[name]" tabindex="2" />
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="comment-form-email">{{ site.data.ui-text[site.locale].comment_form_email_label | default: "Email address" }} <small class="required">*</small></label>
|
||||||
|
<input type="email" id="comment-form-email" name="fields[email]" tabindex="3" />
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="comment-form-url">{{ site.data.ui-text[site.locale].comment_form_website_label | default: "Website (optional)" }}</label>
|
||||||
|
<input type="url" id="comment-form-url" name="fields[url]" tabindex="4"/>
|
||||||
|
</div>
|
||||||
|
<div class="form-group hidden" style="display: none;">
|
||||||
|
<input type="hidden" name="options[slug]" value="{{ page.slug }}">
|
||||||
|
<label for="comment-form-location">Not used. Leave blank if you are a human.</label>
|
||||||
|
<input type="text" id="comment-form-location" name="fields[hidden]" autocomplete="off"/>
|
||||||
|
</div>
|
||||||
|
<!-- Start comment form alert messaging -->
|
||||||
|
<p class="hidden js-notice">
|
||||||
|
<strong class="js-notice-text"></strong>
|
||||||
|
</p>
|
||||||
|
<!-- End comment form alert messaging -->
|
||||||
|
<div class="form-group">
|
||||||
|
<button type="submit" id="comment-form-submit" tabindex="5" class="btn btn--primary btn--large">{{ site.data.ui-text[site.locale].comment_btn_submit | default: "Submit Comment" }}</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
<!-- End new comment form -->
|
||||||
|
{% endif %}
|
||||||
|
</section>
|
||||||
|
{% when "utterances" %}
|
||||||
|
<h4 class="page__comments-title">{{ comments_label }}</h4>
|
||||||
|
<section id="utterances-comments"></section>
|
||||||
|
{% when "custom" %}
|
||||||
|
{% include /comments-providers/custom.html %}
|
||||||
|
{% endcase %}
|
||||||
|
</div>
|
21
docs/_includes/documents-collection.html
Normal file
21
docs/_includes/documents-collection.html
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
{% assign entries = site[include.collection] %}
|
||||||
|
|
||||||
|
{% if include.sort_by == 'title' %}
|
||||||
|
{% if include.sort_order == 'reverse' %}
|
||||||
|
{% assign entries = entries | sort: 'title' | reverse %}
|
||||||
|
{% else %}
|
||||||
|
{% assign entries = entries | sort: 'title' %}
|
||||||
|
{% endif %}
|
||||||
|
{% elsif include.sort_by == 'date' %}
|
||||||
|
{% if include.sort_order == 'reverse' %}
|
||||||
|
{% assign entries = entries | sort: 'date' | reverse %}
|
||||||
|
{% else %}
|
||||||
|
{% assign entries = entries | sort: 'date' %}
|
||||||
|
{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{%- for post in entries -%}
|
||||||
|
{%- unless post.hidden -%}
|
||||||
|
{% include archive-single.html %}
|
||||||
|
{%- endunless -%}
|
||||||
|
{%- endfor -%}
|
41
docs/_includes/feature_row
Normal file
41
docs/_includes/feature_row
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
{% if include.id %}
|
||||||
|
{% assign feature_row = page[include.id] %}
|
||||||
|
{% else %}
|
||||||
|
{% assign feature_row = page.feature_row %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<div class="feature__wrapper">
|
||||||
|
|
||||||
|
{% for f in feature_row %}
|
||||||
|
<div class="feature__item{% if include.type %}--{{ include.type }}{% endif %}">
|
||||||
|
<div class="archive__item">
|
||||||
|
{% if f.image_path %}
|
||||||
|
<div class="archive__item-teaser">
|
||||||
|
<img src="{{ f.image_path | relative_url }}"
|
||||||
|
alt="{% if f.alt %}{{ f.alt }}{% endif %}">
|
||||||
|
{% if f.image_caption %}
|
||||||
|
<span class="archive__item-caption">{{ f.image_caption | markdownify | remove: "<p>" | remove: "</p>" }}</span>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<div class="archive__item-body">
|
||||||
|
{% if f.title %}
|
||||||
|
<h2 class="archive__item-title">{{ f.title }}</h2>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if f.excerpt %}
|
||||||
|
<div class="archive__item-excerpt">
|
||||||
|
{{ f.excerpt | markdownify }}
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if f.url %}
|
||||||
|
<p><a href="{{ f.url | relative_url }}" class="btn {{ f.btn_class }}">{{ f.btn_label | default: site.data.ui-text[site.locale].more_label | default: "Learn More" }}</a></p>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
</div>
|
9
docs/_includes/figure
Normal file
9
docs/_includes/figure
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
<figure class="{{ include.class }}">
|
||||||
|
<img src="{{ include.image_path | relative_url }}"
|
||||||
|
alt="{% if include.alt %}{{ include.alt }}{% endif %}">
|
||||||
|
{% if include.caption %}
|
||||||
|
<figcaption>
|
||||||
|
{{ include.caption | markdownify | remove: "<p>" | remove: "</p>" }}
|
||||||
|
</figcaption>
|
||||||
|
{% endif %}
|
||||||
|
</figure>
|
19
docs/_includes/footer.html
Normal file
19
docs/_includes/footer.html
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
<div class="page__footer-follow">
|
||||||
|
<ul class="social-icons">
|
||||||
|
{% if site.data.ui-text[site.locale].follow_label %}
|
||||||
|
<li><strong>{{ site.data.ui-text[site.locale].follow_label }}</strong></li>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if site.footer.links %}
|
||||||
|
{% for link in site.footer.links %}
|
||||||
|
{% if link.label and link.url %}
|
||||||
|
<li><a href="{{ link.url }}" rel="nofollow noopener noreferrer"><i class="{{ link.icon | default: 'fas fa-link' }}" aria-hidden="true"></i> {{ link.label }}</a></li>
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<li><a href="{% if site.atom_feed.path %}{{ site.atom_feed.path }}{% else %}{{ '/feed.xml' | relative_url }}{% endif %}"><i class="fas fa-fw fa-rss-square" aria-hidden="true"></i> {{ site.data.ui-text[site.locale].feed_label | default: "Feed" }}</a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="page__footer-copyright">© {{ site.time | date: '%Y' }} {{ site.name | default: site.title }}. {{ site.data.ui-text[site.locale].powered_by | default: "Powered by" }} <a href="https://jekyllrb.com" rel="nofollow">Jekyll</a> & <a href="https://mademistakes.com/work/minimal-mistakes-jekyll-theme/" rel="nofollow">Minimal Mistakes</a>.</div>
|
35
docs/_includes/gallery
Normal file
35
docs/_includes/gallery
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
{% if include.id %}
|
||||||
|
{% assign gallery = page[include.id] %}
|
||||||
|
{% else %}
|
||||||
|
{% assign gallery = page.gallery %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if include.layout %}
|
||||||
|
{% assign gallery_layout = include.layout %}
|
||||||
|
{% else %}
|
||||||
|
{% if gallery.size == 2 %}
|
||||||
|
{% assign gallery_layout = 'half' %}
|
||||||
|
{% elsif gallery.size >= 3 %}
|
||||||
|
{% assign gallery_layout = 'third' %}
|
||||||
|
{% else %}
|
||||||
|
{% assign gallery_layout = '' %}
|
||||||
|
{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<figure class="{{ gallery_layout }} {{ include.class }}">
|
||||||
|
{% for img in gallery %}
|
||||||
|
{% if img.url %}
|
||||||
|
<a href="{{ img.url | relative_url }}"
|
||||||
|
{% if img.title %}title="{{ img.title }}"{% endif %}>
|
||||||
|
<img src="{{ img.image_path | relative_url }}"
|
||||||
|
alt="{% if img.alt %}{{ img.alt }}{% endif %}">
|
||||||
|
</a>
|
||||||
|
{% else %}
|
||||||
|
<img src="{{ img.image_path | relative_url }}"
|
||||||
|
alt="{% if img.alt %}{{ img.alt }}{% endif %}">
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
{% if include.caption %}
|
||||||
|
<figcaption>{{ include.caption | markdownify | remove: "<p>" | remove: "</p>" }}</figcaption>
|
||||||
|
{% endif %}
|
||||||
|
</figure>
|
47
docs/_includes/group-by-array
Normal file
47
docs/_includes/group-by-array
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
<!--
|
||||||
|
# Jekyll Group-By-Array 0.1.0
|
||||||
|
# https://github.com/mushishi78/jekyll-group-by-array
|
||||||
|
# © 2015 Max White <mushishi78@gmail.com>
|
||||||
|
# MIT License
|
||||||
|
-->
|
||||||
|
|
||||||
|
<!-- Initialize -->
|
||||||
|
{% assign __empty_array = '' | split: ',' %}
|
||||||
|
{% assign group_names = __empty_array %}
|
||||||
|
{% assign group_items = __empty_array %}
|
||||||
|
|
||||||
|
<!-- Map -->
|
||||||
|
{% assign __names = include.collection | map: include.field %}
|
||||||
|
|
||||||
|
<!-- Flatten -->
|
||||||
|
{% assign __names = __names | join: ',' | join: ',' | split: ',' %}
|
||||||
|
|
||||||
|
<!-- Uniq -->
|
||||||
|
{% assign __names = __names | sort %}
|
||||||
|
{% for name in __names %}
|
||||||
|
|
||||||
|
<!-- If not equal to previous then it must be unique as sorted -->
|
||||||
|
{% unless name == previous %}
|
||||||
|
|
||||||
|
<!-- Push to group_names -->
|
||||||
|
{% assign group_names = group_names | push: name %}
|
||||||
|
{% endunless %}
|
||||||
|
|
||||||
|
{% assign previous = name %}
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
|
||||||
|
<!-- group_items -->
|
||||||
|
{% for name in group_names %}
|
||||||
|
|
||||||
|
<!-- Collect if contains -->
|
||||||
|
{% assign __item = __empty_array %}
|
||||||
|
{% for __element in include.collection %}
|
||||||
|
{% if __element[include.field] contains name %}
|
||||||
|
{% assign __item = __item | push: __element %}
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
<!-- Push to group_items -->
|
||||||
|
{% assign group_items = group_items | push: __item %}
|
||||||
|
{% endfor %}
|
37
docs/_includes/head.html
Normal file
37
docs/_includes/head.html
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
<meta charset="utf-8">
|
||||||
|
|
||||||
|
{% include seo.html %}
|
||||||
|
|
||||||
|
<link href="{% if site.atom_feed.path %}{{ site.atom_feed.path }}{% else %}{{ '/feed.xml' | relative_url }}{% endif %}" type="application/atom+xml" rel="alternate" title="{{ site.title }} Feed">
|
||||||
|
|
||||||
|
<!-- https://t.co/dKP3o1e -->
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
|
||||||
|
<script>
|
||||||
|
document.documentElement.className = document.documentElement.className.replace(/\bno-js\b/g, '') + ' js ';
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<!-- For all browsers -->
|
||||||
|
<link rel="stylesheet" href="{{ '/assets/css/main.css' | relative_url }}">
|
||||||
|
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@5/css/all.min.css">
|
||||||
|
|
||||||
|
<!--[if IE]>
|
||||||
|
<style>
|
||||||
|
/* old IE unsupported flexbox fixes */
|
||||||
|
.greedy-nav .site-title {
|
||||||
|
padding-right: 3em;
|
||||||
|
}
|
||||||
|
.greedy-nav button {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
right: 0;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<![endif]-->
|
||||||
|
|
||||||
|
{% if site.head_scripts %}
|
||||||
|
{% for script in site.head_scripts %}
|
||||||
|
<script src="{{ script | relative_url }}"></script>
|
||||||
|
{% endfor %}
|
||||||
|
{% endif %}
|
37
docs/_includes/masthead.html
Normal file
37
docs/_includes/masthead.html
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
{% capture logo_path %}{{ site.logo }}{% endcapture %}
|
||||||
|
|
||||||
|
<div class="masthead">
|
||||||
|
<div class="masthead__inner-wrap">
|
||||||
|
<div class="masthead__menu">
|
||||||
|
<nav id="site-nav" class="greedy-nav">
|
||||||
|
{% unless logo_path == empty %}
|
||||||
|
<a class="site-logo" href="{{ '/' | relative_url }}"><img src="{{ logo_path | relative_url }}" alt=""></a>
|
||||||
|
{% endunless %}
|
||||||
|
<!-- <a class="site-title" href="{{ '/' | relative_url }}">
|
||||||
|
{{ site.masthead_title | default: site.title }}
|
||||||
|
{% if site.subtitle %}<span class="site-subtitle">{{ site.subtitle }}</span>{% endif %}
|
||||||
|
</a> -->
|
||||||
|
<ul class="visible-links">
|
||||||
|
{%- for link in site.data.navigation.main -%}
|
||||||
|
<li class="masthead__menu-item">
|
||||||
|
<a href="{{ link.url | relative_url }}"{% if link.description %} title="{{ link.description }}"{% endif %}>{{ link.title }}</a>
|
||||||
|
</li>
|
||||||
|
{%- endfor -%}
|
||||||
|
</ul>
|
||||||
|
{% if site.search == true %}
|
||||||
|
<button class="search__toggle" type="button">
|
||||||
|
<span class="visually-hidden">{{ site.data.ui-text[site.locale].search_label | default: "Toggle search" }}</span>
|
||||||
|
<svg class="icon" width="16" height="16" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.99 16">
|
||||||
|
<path d="M15.5,13.12L13.19,10.8a1.69,1.69,0,0,0-1.28-.55l-0.06-.06A6.5,6.5,0,0,0,5.77,0,6.5,6.5,0,0,0,2.46,11.59a6.47,6.47,0,0,0,7.74.26l0.05,0.05a1.65,1.65,0,0,0,.5,1.24l2.38,2.38A1.68,1.68,0,0,0,15.5,13.12ZM6.4,2A4.41,4.41,0,1,1,2,6.4,4.43,4.43,0,0,1,6.4,2Z" transform="translate(-.01)"></path>
|
||||||
|
</svg>
|
||||||
|
</button>
|
||||||
|
{% endif %}
|
||||||
|
<button class="greedy-nav__toggle hidden" type="button">
|
||||||
|
<span class="visually-hidden">{{ site.data.ui-text[site.locale].menu_label | default: "Toggle menu" }}</span>
|
||||||
|
<div class="navicon"></div>
|
||||||
|
</button>
|
||||||
|
<ul class="hidden-links hidden"></ul>
|
||||||
|
</nav>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
26
docs/_includes/nav_list
Normal file
26
docs/_includes/nav_list
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
{% assign navigation = site.data.navigation[include.nav] %}
|
||||||
|
|
||||||
|
<nav class="nav__list">
|
||||||
|
{% if page.sidebar.title %}<h3 class="nav__title" style="padding-left: 0;">{{ page.sidebar.title }}</h3>{% endif %}
|
||||||
|
<input id="ac-toc" name="accordion-toc" type="checkbox" />
|
||||||
|
<label for="ac-toc">{{ site.data.ui-text[site.locale].menu_label | default: "Toggle Menu" }}</label>
|
||||||
|
<ul class="nav__items">
|
||||||
|
{% for nav in navigation %}
|
||||||
|
<li>
|
||||||
|
{% if nav.url %}
|
||||||
|
<a href="{{ nav.url | relative_url }}"><span class="nav__sub-title">{{ nav.title }}</span></a>
|
||||||
|
{% else %}
|
||||||
|
<span class="nav__sub-title">{{ nav.title }}</span>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if nav.children != null %}
|
||||||
|
<ul>
|
||||||
|
{% for child in nav.children %}
|
||||||
|
<li><a href="{{ child.url | relative_url }}"{% if child.url == page.url %} class="active"{% endif %}>{{ child.title }}</a></li>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
{% endif %}
|
||||||
|
</li>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
</nav>
|
5
docs/_includes/page__date.html
Normal file
5
docs/_includes/page__date.html
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
{% if page.last_modified_at %}
|
||||||
|
<p class="page__date"><strong><i class="fas fa-fw fa-calendar-alt" aria-hidden="true"></i> {{ site.data.ui-text[site.locale].date_label | default: "Updated:" }}</strong> <time datetime="{{ page.last_modified_at | date: "%Y-%m-%d" }}">{{ page.last_modified_at | date: "%B %-d, %Y" }}</time></p>
|
||||||
|
{% elsif page.date %}
|
||||||
|
<p class="page__date"><strong><i class="fas fa-fw fa-calendar-alt" aria-hidden="true"></i> {{ site.data.ui-text[site.locale].date_label | default: "Updated:" }}</strong> <time datetime="{{ page.date | date_to_xmlschema }}">{{ page.date | date: "%B %-d, %Y" }}</time></p>
|
||||||
|
{% endif %}
|
51
docs/_includes/page__hero.html
Normal file
51
docs/_includes/page__hero.html
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
{% capture overlay_img_path %}{{ page.header.overlay_image | relative_url }}{% endcapture %}
|
||||||
|
|
||||||
|
{% if page.header.overlay_filter contains "rgba" %}
|
||||||
|
{% capture overlay_filter %}{{ page.header.overlay_filter }}{% endcapture %}
|
||||||
|
{% elsif page.header.overlay_filter %}
|
||||||
|
{% capture overlay_filter %}rgba(0, 0, 0, {{ page.header.overlay_filter }}){% endcapture %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if page.header.image_description %}
|
||||||
|
{% assign image_description = page.header.image_description %}
|
||||||
|
{% else %}
|
||||||
|
{% assign image_description = page.title %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% assign image_description = image_description | markdownify | strip_html | strip_newlines | escape_once %}
|
||||||
|
|
||||||
|
<div class="page__hero{% if page.header.overlay_color or page.header.overlay_image %}--overlay{% endif %}"
|
||||||
|
style="{% if page.header.overlay_color %}background-color: {{ page.header.overlay_color | default: 'transparent' }};{% endif %} {% if overlay_img_path %}background-image: {% if overlay_filter %}linear-gradient({{ overlay_filter }}, {{ overlay_filter }}), {% endif %}url('{{ overlay_img_path }}');{% endif %}"
|
||||||
|
>
|
||||||
|
{% if page.header.overlay_color or page.header.overlay_image %}
|
||||||
|
<div class="wrapper">
|
||||||
|
<h1 id="page-title" class="page__title" itemprop="headline">
|
||||||
|
{% if paginator and site.paginate_show_page_num %}
|
||||||
|
{{ site.title }}{% unless paginator.page == 1 %} {{ site.data.ui-text[site.locale].page | default: "Page" }} {{ paginator.page }}{% endunless %}
|
||||||
|
{% else %}
|
||||||
|
{{ page.title | default: site.title | markdownify | remove: "<p>" | remove: "</p>" }}
|
||||||
|
{% endif %}
|
||||||
|
</h1>
|
||||||
|
{% if page.tagline %}
|
||||||
|
<p class="page__lead">{{ page.tagline | markdownify | remove: "<p>" | remove: "</p>" }}</p>
|
||||||
|
{% elsif page.header.show_overlay_excerpt != false and page.excerpt %}
|
||||||
|
<p class="page__lead">{{ page.excerpt | markdownify | remove: "<p>" | remove: "</p>" }}</p>
|
||||||
|
{% endif %}
|
||||||
|
{% include page__meta.html %}
|
||||||
|
{% if page.header.cta_url %}
|
||||||
|
<p><a href="{{ page.header.cta_url | relative_url }}" class="btn btn--light-outline btn--large">{{ page.header.cta_label | default: site.data.ui-text[site.locale].more_label | default: "Learn More" }}</a></p>
|
||||||
|
{% endif %}
|
||||||
|
{% if page.header.actions %}
|
||||||
|
<p>
|
||||||
|
{% for action in page.header.actions %}
|
||||||
|
<a href="{{ action.url | relative_url }}" class="btn btn--light-outline btn--large">{{ action.label | default: site.data.ui-text[site.locale].more_label | default: "Learn More" }}</a>
|
||||||
|
{% endfor %}
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
{% else %}
|
||||||
|
<img src="{{ page.header.image | relative_url }}" alt="{{ image_description }}" class="page__hero-image">
|
||||||
|
{% endif %}
|
||||||
|
{% if page.header.caption %}
|
||||||
|
<span class="page__hero-caption">{{ page.header.caption | markdownify | remove: "<p>" | remove: "</p>" }}</span>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
2
docs/_includes/page__hero_video.html
Normal file
2
docs/_includes/page__hero_video.html
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
{% assign video = page.header.video %}
|
||||||
|
{% include video id=video.id provider=video.provider danmaku=video.danmaku %}
|
30
docs/_includes/page__meta.html
Normal file
30
docs/_includes/page__meta.html
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
{% assign document = post | default: page %}
|
||||||
|
{% if document.read_time or document.show_date %}
|
||||||
|
<p class="page__meta">
|
||||||
|
{% if document.show_date and document.date %}
|
||||||
|
{% assign date = document.date %}
|
||||||
|
<span class="page__meta-date">
|
||||||
|
<i class="far {% if include.type == 'grid' and document.read_time and document.show_date %}fa-fw {% endif %}fa-calendar-alt" aria-hidden="true"></i>
|
||||||
|
<time datetime="{{ date | date_to_xmlschema }}">{{ date | date: "%B %-d, %Y" }}</time>
|
||||||
|
</span>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if document.read_time and document.show_date %}<span class="page__meta-sep"></span>{% endif %}
|
||||||
|
|
||||||
|
{% if document.read_time %}
|
||||||
|
{% assign words_per_minute = document.words_per_minute | default: site.words_per_minute | default: 200 %}
|
||||||
|
{% assign words = document.content | strip_html | number_of_words %}
|
||||||
|
|
||||||
|
<span class="page__meta-readtime">
|
||||||
|
<i class="far {% if include.type == 'grid' and document.read_time and document.show_date %}fa-fw {% endif %}fa-clock" aria-hidden="true"></i>
|
||||||
|
{% if words < words_per_minute %}
|
||||||
|
{{ site.data.ui-text[site.locale].less_than | default: "less than" }} 1 {{ site.data.ui-text[site.locale].minute_read | default: "minute read" }}
|
||||||
|
{% elsif words == words_per_minute %}
|
||||||
|
1 {{ site.data.ui-text[site.locale].minute_read | default: "minute read" }}
|
||||||
|
{% else %}
|
||||||
|
{{ words | divided_by: words_per_minute }} {{ site.data.ui-text[site.locale].minute_read | default: "minute read" }}
|
||||||
|
{% endif %}
|
||||||
|
</span>
|
||||||
|
{% endif %}
|
||||||
|
</p>
|
||||||
|
{% endif %}
|
7
docs/_includes/page__taxonomy.html
Normal file
7
docs/_includes/page__taxonomy.html
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
{% if site.tag_archive.type and page.tags[0] %}
|
||||||
|
{% include tag-list.html %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if site.category_archive.type and page.categories[0] %}
|
||||||
|
{% include category-list.html %}
|
||||||
|
{% endif %}
|
69
docs/_includes/paginator.html
Normal file
69
docs/_includes/paginator.html
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
{% if paginator.total_pages > 1 %}
|
||||||
|
<nav class="pagination">
|
||||||
|
{% assign first_page_path = paginator.first_page_path | default: site.paginate_path | replace: 'page:num', '' | replace: '//', '/' | relative_url %}
|
||||||
|
<ul>
|
||||||
|
{% comment %} Link for previous page {% endcomment %}
|
||||||
|
{% if paginator.previous_page %}
|
||||||
|
{% if paginator.previous_page == 1 %}
|
||||||
|
<li><a href="{{ first_page_path }}">{{ site.data.ui-text[site.locale].pagination_previous | default: "Previous" }}</a></li>
|
||||||
|
{% else %}
|
||||||
|
<li><a href="{{ site.paginate_path | replace: ':num', paginator.previous_page | replace: '//', '/' | relative_url }}">{{ site.data.ui-text[site.locale].pagination_previous | default: "Previous" }}</a></li>
|
||||||
|
{% endif %}
|
||||||
|
{% else %}
|
||||||
|
<li><a href="#" class="disabled"><span aria-hidden="true">{{ site.data.ui-text[site.locale].pagination_previous | default: "Previous" }}</span></a></li>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% comment %} First page {% endcomment %}
|
||||||
|
{% if paginator.page == 1 %}
|
||||||
|
<li><a href="#" class="disabled current">1</a></li>
|
||||||
|
{% else %}
|
||||||
|
<li><a href="{{ first_page_path }}">1</a></li>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% assign page_start = 2 %}
|
||||||
|
{% if paginator.page > 4 %}
|
||||||
|
{% assign page_start = paginator.page | minus: 2 %}
|
||||||
|
{% comment %} Ellipsis for truncated links {% endcomment %}
|
||||||
|
<li><a href="#" class="disabled">…</a></li>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% assign page_end = paginator.total_pages | minus: 1 %}
|
||||||
|
{% assign pages_to_end = paginator.total_pages | minus: paginator.page %}
|
||||||
|
{% if pages_to_end > 4 %}
|
||||||
|
{% assign page_end = paginator.page | plus: 2 %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% for index in (page_start..page_end) %}
|
||||||
|
{% if index == paginator.page %}
|
||||||
|
<li><a href="{{ site.paginate_path | replace: ':num', index | replace: '//', '/' | relative_url }}" class="disabled current">{{ index }}</a></li>
|
||||||
|
{% else %}
|
||||||
|
{% comment %} Distance from current page and this link {% endcomment %}
|
||||||
|
{% assign dist = paginator.page | minus: index %}
|
||||||
|
{% if dist < 0 %}
|
||||||
|
{% comment %} Distance must be a positive value {% endcomment %}
|
||||||
|
{% assign dist = 0 | minus: dist %}
|
||||||
|
{% endif %}
|
||||||
|
<li><a href="{{ site.paginate_path | replace: ':num', index | relative_url }}">{{ index }}</a></li>
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
{% comment %} Ellipsis for truncated links {% endcomment %}
|
||||||
|
{% if pages_to_end > 3 %}
|
||||||
|
<li><a href="#" class="disabled">…</a></li>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if paginator.page == paginator.total_pages %}
|
||||||
|
<li><a href="#" class="disabled current">{{ paginator.page }}</a></li>
|
||||||
|
{% else %}
|
||||||
|
<li><a href="{{ site.paginate_path | replace: ':num', paginator.total_pages | replace: '//', '/' | relative_url }}">{{ paginator.total_pages }}</a></li>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% comment %} Link next page {% endcomment %}
|
||||||
|
{% if paginator.next_page %}
|
||||||
|
<li><a href="{{ site.paginate_path | replace: ':num', paginator.next_page | replace: '//', '/' | relative_url }}">{{ site.data.ui-text[site.locale].pagination_next | default: "Next" }}</a></li>
|
||||||
|
{% else %}
|
||||||
|
<li><a href="#" class="disabled"><span aria-hidden="true">{{ site.data.ui-text[site.locale].pagination_next | default: "Next" }}</span></a></li>
|
||||||
|
{% endif %}
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
{% endif %}
|
14
docs/_includes/post_pagination.html
Normal file
14
docs/_includes/post_pagination.html
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
{% if page.previous or page.next %}
|
||||||
|
<nav class="pagination">
|
||||||
|
{% if page.previous %}
|
||||||
|
<a href="{{ page.previous.url | relative_url }}" class="pagination--pager" title="{{ page.previous.title | markdownify | strip_html }}">{{ site.data.ui-text[site.locale].pagination_previous | default: "Previous" }}</a>
|
||||||
|
{% else %}
|
||||||
|
<a href="#" class="pagination--pager disabled">{{ site.data.ui-text[site.locale].pagination_previous | default: "Previous" }}</a>
|
||||||
|
{% endif %}
|
||||||
|
{% if page.next %}
|
||||||
|
<a href="{{ page.next.url | relative_url }}" class="pagination--pager" title="{{ page.next.title | markdownify | strip_html }}">{{ site.data.ui-text[site.locale].pagination_next | default: "Next" }}</a>
|
||||||
|
{% else %}
|
||||||
|
<a href="#" class="pagination--pager disabled">{{ site.data.ui-text[site.locale].pagination_next | default: "Next" }}</a>
|
||||||
|
{% endif %}
|
||||||
|
</nav>
|
||||||
|
{% endif %}
|
5
docs/_includes/posts-category.html
Normal file
5
docs/_includes/posts-category.html
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
{%- for post in site.categories[include.taxonomy] -%}
|
||||||
|
{%- unless post.hidden -%}
|
||||||
|
{% include archive-single.html %}
|
||||||
|
{%- endunless -%}
|
||||||
|
{%- endfor -%}
|
5
docs/_includes/posts-tag.html
Normal file
5
docs/_includes/posts-tag.html
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
{%- for post in site.tags[include.taxonomy] -%}
|
||||||
|
{%- unless post.hidden -%}
|
||||||
|
{% include archive-single.html %}
|
||||||
|
{%- endunless -%}
|
||||||
|
{%- endfor -%}
|
28
docs/_includes/scripts.html
Normal file
28
docs/_includes/scripts.html
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
{% if site.footer_scripts %}
|
||||||
|
{% for script in site.footer_scripts %}
|
||||||
|
<script src="{{ script | relative_url }}"></script>
|
||||||
|
{% endfor %}
|
||||||
|
{% else %}
|
||||||
|
<script src="{{ '/assets/js/main.min.js' | relative_url }}"></script>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if site.search == true or page.layout == "search" %}
|
||||||
|
{%- assign search_provider = site.search_provider | default: "lunr" -%}
|
||||||
|
{%- case search_provider -%}
|
||||||
|
{%- when "lunr" -%}
|
||||||
|
{% include_cached search/lunr-search-scripts.html %}
|
||||||
|
{%- when "google" -%}
|
||||||
|
{% include_cached search/google-search-scripts.html %}
|
||||||
|
{%- when "algolia" -%}
|
||||||
|
{% include_cached search/algolia-search-scripts.html %}
|
||||||
|
{%- endcase -%}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% include analytics.html %}
|
||||||
|
{% include /comments-providers/scripts.html %}
|
||||||
|
|
||||||
|
{% if site.after_footer_scripts %}
|
||||||
|
{% for script in site.after_footer_scripts %}
|
||||||
|
<script src="{{ script | relative_url }}"></script>
|
||||||
|
{% endfor %}
|
||||||
|
{% endif %}
|
155
docs/_includes/seo.html
Normal file
155
docs/_includes/seo.html
Normal file
@ -0,0 +1,155 @@
|
|||||||
|
<!-- begin _includes/seo.html -->
|
||||||
|
{%- if site.url -%}
|
||||||
|
{%- assign seo_url = site.url | append: site.baseurl -%}
|
||||||
|
{%- endif -%}
|
||||||
|
{%- assign seo_url = seo_url | default: site.github.url -%}
|
||||||
|
|
||||||
|
{% assign title_separator = site.title_separator | default: '-' | replace: '|', '|' %}
|
||||||
|
|
||||||
|
{%- if page.title -%}
|
||||||
|
{%- assign seo_title = page.title | append: " " | append: title_separator | append: " " | append: site.title -%}
|
||||||
|
{%- endif -%}
|
||||||
|
|
||||||
|
{%- if seo_title -%}
|
||||||
|
{%- assign seo_title = seo_title | markdownify | strip_html | strip_newlines | escape_once -%}
|
||||||
|
{%- endif -%}
|
||||||
|
|
||||||
|
{% if page.canonical_url %}
|
||||||
|
{%- assign canonical_url = page.canonical_url %}
|
||||||
|
{% else %}
|
||||||
|
{%- assign canonical_url = page.url | replace: "index.html", "" | absolute_url %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{%- assign seo_description = page.description | default: page.excerpt | default: site.description -%}
|
||||||
|
{%- if seo_description -%}
|
||||||
|
{%- assign seo_description = seo_description | markdownify | strip_html | newline_to_br | strip_newlines | replace: '<br />', ' ' | escape_once | strip -%}
|
||||||
|
{%- endif -%}
|
||||||
|
|
||||||
|
{%- assign author = page.author | default: page.authors[0] | default: site.author -%}
|
||||||
|
{%- assign author = site.data.authors[author] | default: author -%}
|
||||||
|
|
||||||
|
{%- if author.twitter -%}
|
||||||
|
{%- assign author_twitter = author.twitter | replace: "@", "" -%}
|
||||||
|
{%- endif -%}
|
||||||
|
|
||||||
|
{%- assign page_large_image = page.header.og_image | default: page.header.overlay_image | default: page.header.image | absolute_url -%}
|
||||||
|
{%- assign page_large_image = page_large_image | escape -%}
|
||||||
|
|
||||||
|
{%- assign page_teaser_image = page.header.teaser | default: site.og_image | absolute_url -%}
|
||||||
|
{%- assign page_teaser_image = page_teaser_image | escape -%}
|
||||||
|
|
||||||
|
{%- assign site_og_image = site.og_image | absolute_url -%}
|
||||||
|
{%- assign site_og_image = site_og_image | escape -%}
|
||||||
|
|
||||||
|
{%- if page.date -%}
|
||||||
|
{%- assign og_type = "article" -%}
|
||||||
|
{%- else -%}
|
||||||
|
{%- assign og_type = "website" -%}
|
||||||
|
{%- endif -%}
|
||||||
|
|
||||||
|
<title>{{ seo_title | default: site.title }}{% if paginator %}{% unless paginator.page == 1 %} {{ title_separator }} {{ site.data.ui-text[site.locale].page | default: "Page" }} {{ paginator.page }}{% endunless %}{% endif %}</title>
|
||||||
|
<meta name="description" content="{{ seo_description }}">
|
||||||
|
|
||||||
|
{% if author.name %}
|
||||||
|
<meta name="author" content="{{ author.name | default: author }}">
|
||||||
|
{% if og_type == "article" %}
|
||||||
|
<meta property="article:author" content="{{ author.name | default: author }}">
|
||||||
|
{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<meta property="og:type" content="{{ og_type }}">
|
||||||
|
<meta property="og:locale" content="{{ site.locale | replace: "-", "_" | default: "en_US" }}">
|
||||||
|
<meta property="og:site_name" content="{{ site.title }}">
|
||||||
|
<meta property="og:title" content="{{ page.title | default: site.title | markdownify | strip_html | strip_newlines | escape_once }}">
|
||||||
|
<meta property="og:url" content="{{ canonical_url }}">
|
||||||
|
|
||||||
|
{% if seo_description %}
|
||||||
|
<meta property="og:description" content="{{ seo_description }}">
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if page_large_image %}
|
||||||
|
<meta property="og:image" content="{{ page_large_image }}">
|
||||||
|
{% elsif page_teaser_image %}
|
||||||
|
<meta property="og:image" content="{{ page_teaser_image }}">
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if site.twitter.username %}
|
||||||
|
<meta name="twitter:site" content="@{{ site.twitter.username | replace: "@", "" }}">
|
||||||
|
<meta name="twitter:title" content="{{ page.title | default: site.title | markdownify | strip_html | strip_newlines | escape_once }}">
|
||||||
|
<meta name="twitter:description" content="{{ seo_description }}">
|
||||||
|
<meta name="twitter:url" content="{{ canonical_url }}">
|
||||||
|
|
||||||
|
{% if page_large_image %}
|
||||||
|
<meta name="twitter:card" content="summary_large_image">
|
||||||
|
<meta name="twitter:image" content="{{ page_large_image }}">
|
||||||
|
{% else %}
|
||||||
|
<meta name="twitter:card" content="summary">
|
||||||
|
{% if page_teaser_image %}
|
||||||
|
<meta name="twitter:image" content="{{ page_teaser_image }}">
|
||||||
|
{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if author_twitter %}
|
||||||
|
<meta name="twitter:creator" content="@{{ author_twitter }}">
|
||||||
|
{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if page.date %}
|
||||||
|
<meta property="article:published_time" content="{{ page.date | date_to_xmlschema }}">
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if og_type == "article" and page.last_modified_at %}
|
||||||
|
<meta property="article:modified_time" content="{{ page.last_modified_at | date_to_xmlschema }}">
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if site.facebook %}
|
||||||
|
{% if site.facebook.publisher %}
|
||||||
|
<meta property="article:publisher" content="{{ site.facebook.publisher }}">
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if site.facebook.app_id %}
|
||||||
|
<meta property="fb:app_id" content="{{ site.facebook.app_id }}">
|
||||||
|
{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<link rel="canonical" href="{{ canonical_url }}">
|
||||||
|
|
||||||
|
{% if paginator.previous_page %}
|
||||||
|
<link rel="prev" href="{{ paginator.previous_page_path | absolute_url }}">
|
||||||
|
{% endif %}
|
||||||
|
{% if paginator.next_page %}
|
||||||
|
<link rel="next" href="{{ paginator.next_page_path | absolute_url }}">
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<script type="application/ld+json">
|
||||||
|
{
|
||||||
|
"@context": "https://schema.org",
|
||||||
|
{% if site.social.type == "Organization" %}
|
||||||
|
"@type": "Organization",
|
||||||
|
"url": {{ '/' | absolute_url | jsonify }}{% if site.og_image %},
|
||||||
|
"logo": {{ site_og_image | jsonify }}{% endif %}
|
||||||
|
{% else %}
|
||||||
|
"@type": "Person",
|
||||||
|
"name": {{ site.social.name | default: site.name | jsonify }},
|
||||||
|
"url": {{ '/' | absolute_url |jsonify }}{% if site.social.links %},
|
||||||
|
"sameAs": {{ site.social.links | jsonify }}{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
{% if site.google_site_verification %}
|
||||||
|
<meta name="google-site-verification" content="{{ site.google_site_verification }}" />
|
||||||
|
{% endif %}
|
||||||
|
{% if site.bing_site_verification %}
|
||||||
|
<meta name="msvalidate.01" content="{{ site.bing_site_verification }}">
|
||||||
|
{% endif %}
|
||||||
|
{% if site.alexa_site_verification %}
|
||||||
|
<meta name="alexaVerifyID" content="{{ site.alexa_site_verification }}">
|
||||||
|
{% endif %}
|
||||||
|
{% if site.yandex_site_verification %}
|
||||||
|
<meta name="yandex-verification" content="{{ site.yandex_site_verification }}">
|
||||||
|
{% endif %}
|
||||||
|
{% if site.naver_site_verification %}
|
||||||
|
<meta name="naver-site-verification" content="{{ site.naver_site_verification }}">
|
||||||
|
{% endif %}
|
||||||
|
<!-- end _includes/seo.html -->
|
19
docs/_includes/sidebar.html
Normal file
19
docs/_includes/sidebar.html
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
{% if page.author_profile or layout.author_profile or page.sidebar %}
|
||||||
|
<div class="sidebar sticky">
|
||||||
|
{% if page.author_profile or layout.author_profile %}{% include author-profile.html %}{% endif %}
|
||||||
|
{% if page.sidebar %}
|
||||||
|
{% for s in page.sidebar %}
|
||||||
|
{% if s.image %}
|
||||||
|
<img src="{{ s.image | relative_url }}"
|
||||||
|
alt="{% if s.image_alt %}{{ s.image_alt }}{% endif %}">
|
||||||
|
{% endif %}
|
||||||
|
{% if s.title %}<h3>{{ s.title }}</h3>{% endif %}
|
||||||
|
{% if s.text %}{{ s.text | markdownify }}{% endif %}
|
||||||
|
{% if s.nav %}{% include nav_list nav=s.nav %}{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
{% if page.sidebar.nav %}
|
||||||
|
{% include nav_list nav=page.sidebar.nav %}
|
||||||
|
{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
8
docs/_includes/skip-links.html
Normal file
8
docs/_includes/skip-links.html
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
<nav class="skip-links">
|
||||||
|
<h2 class="screen-reader-text">{{ site.data.ui-text[site.locale].skip_links | default: 'Skip links' }}</h2>
|
||||||
|
<ul>
|
||||||
|
<li><a href="#site-nav" class="screen-reader-shortcut">{{ site.data.ui-text[site.locale].skip_primary_nav | default: 'Skip to primary navigation' }}</a></li>
|
||||||
|
<li><a href="#main" class="screen-reader-shortcut">{{ site.data.ui-text[site.locale].skip_content | default: 'Skip to content' }}</a></li>
|
||||||
|
<li><a href="#footer" class="screen-reader-shortcut">{{ site.data.ui-text[site.locale].skip_footer | default: 'Skip to footer' }}</a></li>
|
||||||
|
</ul>
|
||||||
|
</nav>
|
11
docs/_includes/social-share.html
Normal file
11
docs/_includes/social-share.html
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
<section class="page__share">
|
||||||
|
{% if site.data.ui-text[site.locale].share_on_label %}
|
||||||
|
<h4 class="page__share-title">{{ site.data.ui-text[site.locale].share_on_label | default: "Share on" }}</h4>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<a href="https://twitter.com/intent/tweet?{% if site.twitter.username %}via={{ site.twitter.username | url_encode }}&{% endif %}text={{ page.title | url_encode }}%20{{ page.url | absolute_url | url_encode }}" class="btn btn--twitter" onclick="window.open(this.href, 'window', 'left=20,top=20,width=500,height=500,toolbar=1,resizable=0'); return false;" title="{{ site.data.ui-text[site.locale].share_on_label | default: 'Share on' }} Twitter"><i class="fab fa-fw fa-twitter" aria-hidden="true"></i><span> Twitter</span></a>
|
||||||
|
|
||||||
|
<a href="https://www.facebook.com/sharer/sharer.php?u={{ page.url | absolute_url | url_encode }}" class="btn btn--facebook" onclick="window.open(this.href, 'window', 'left=20,top=20,width=500,height=500,toolbar=1,resizable=0'); return false;" title="{{ site.data.ui-text[site.locale].share_on_label | default: 'Share on' }} Facebook"><i class="fab fa-fw fa-facebook" aria-hidden="true"></i><span> Facebook</span></a>
|
||||||
|
|
||||||
|
<a href="https://www.linkedin.com/shareArticle?mini=true&url={{ page.url | absolute_url | url_encode }}" class="btn btn--linkedin" onclick="window.open(this.href, 'window', 'left=20,top=20,width=500,height=500,toolbar=1,resizable=0'); return false;" title="{{ site.data.ui-text[site.locale].share_on_label | default: 'Share on' }} LinkedIn"><i class="fab fa-fw fa-linkedin" aria-hidden="true"></i><span> LinkedIn</span></a>
|
||||||
|
</section>
|
26
docs/_includes/tag-list.html
Normal file
26
docs/_includes/tag-list.html
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
{% case site.tag_archive.type %}
|
||||||
|
{% when "liquid" %}
|
||||||
|
{% assign path_type = "#" %}
|
||||||
|
{% when "jekyll-archives" %}
|
||||||
|
{% assign path_type = nil %}
|
||||||
|
{% endcase %}
|
||||||
|
|
||||||
|
{% if site.tag_archive.path %}
|
||||||
|
{% comment %}
|
||||||
|
<!-- Sort alphabetically regardless of case e.g. a B c d E -->
|
||||||
|
<!-- modified from http://www.codeofclimber.ru/2015/sorting-site-tags-in-jekyll/ -->
|
||||||
|
{% endcomment %}
|
||||||
|
{% capture page_tags %}{% for tag in page.tags %}{{ tag | downcase }}|{{ tag }}{% unless forloop.last %},{% endunless %}{% endfor %}{% endcapture %}
|
||||||
|
{% assign tag_hashes = page_tags | split: ',' | sort %}
|
||||||
|
|
||||||
|
<p class="page__taxonomy">
|
||||||
|
<strong><i class="fas fa-fw fa-tags" aria-hidden="true"></i> {{ site.data.ui-text[site.locale].tags_label | default: "Tags:" }} </strong>
|
||||||
|
<span itemprop="keywords">
|
||||||
|
{% for hash in tag_hashes %}
|
||||||
|
{% assign keyValue = hash | split: '|' %}
|
||||||
|
{% capture tag_word %}{{ keyValue[1] | strip_newlines }}{% endcapture %}
|
||||||
|
<a href="{{ tag_word | slugify | prepend: path_type | prepend: site.tag_archive.path | relative_url }}" class="page__taxonomy-item" rel="tag">{{ tag_word }}</a>{% unless forloop.last %}<span class="sep">, </span>{% endunless %}
|
||||||
|
{% endfor %}
|
||||||
|
</span>
|
||||||
|
</p>
|
||||||
|
{% endif %}
|
7
docs/_includes/toc
Normal file
7
docs/_includes/toc
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
<aside class="sidebar__right">
|
||||||
|
<nav class="toc" markdown="1">
|
||||||
|
<header><h4 class="nav__title"><i class="fas fa-{{ include.icon | default: 'file-alt' }}"></i> {{ include.title | default: site.data.ui-text[site.locale].toc_label }}</h4></header>
|
||||||
|
* Auto generated table of contents
|
||||||
|
{:toc .toc__menu}
|
||||||
|
</nav>
|
||||||
|
</aside>
|
96
docs/_includes/toc.html
Normal file
96
docs/_includes/toc.html
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
{% capture tocWorkspace %}
|
||||||
|
{% comment %}
|
||||||
|
Version 1.0.8
|
||||||
|
https://github.com/allejo/jekyll-toc
|
||||||
|
|
||||||
|
"...like all things liquid - where there's a will, and ~36 hours to spare, there's usually a/some way" ~jaybe
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
{% include toc.html html=content sanitize=true class="inline_toc" id="my_toc" h_min=2 h_max=3 %}
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
* html (string) - the HTML of compiled markdown generated by kramdown in Jekyll
|
||||||
|
|
||||||
|
Optional Parameters:
|
||||||
|
* sanitize (bool) : false - when set to true, the headers will be stripped of any HTML in the TOC
|
||||||
|
* class (string) : '' - a CSS class assigned to the TOC
|
||||||
|
* id (string) : '' - an ID to assigned to the TOC
|
||||||
|
* h_min (int) : 1 - the minimum TOC header level to use; any header lower than this value will be ignored
|
||||||
|
* h_max (int) : 6 - the maximum TOC header level to use; any header greater than this value will be ignored
|
||||||
|
* ordered (bool) : false - when set to true, an ordered list will be outputted instead of an unordered list
|
||||||
|
* item_class (string) : '' - add custom class(es) for each list item; has support for '%level%' placeholder, which is the current heading level
|
||||||
|
* baseurl (string) : '' - add a base url to the TOC links for when your TOC is on another page than the actual content
|
||||||
|
* anchor_class (string) : '' - add custom class(es) for each anchor element
|
||||||
|
|
||||||
|
Output:
|
||||||
|
An ordered or unordered list representing the table of contents of a markdown block. This snippet will only
|
||||||
|
generate the table of contents and will NOT output the markdown given to it
|
||||||
|
{% endcomment %}
|
||||||
|
|
||||||
|
{% capture my_toc %}{% endcapture %}
|
||||||
|
{% assign orderedList = include.ordered | default: false %}
|
||||||
|
{% assign minHeader = include.h_min | default: 1 %}
|
||||||
|
{% assign maxHeader = include.h_max | default: 6 %}
|
||||||
|
{% assign nodes = include.html | split: '<h' %}
|
||||||
|
{% assign firstHeader = true %}
|
||||||
|
|
||||||
|
{% capture listModifier %}{% if orderedList %}1.{% else %}-{% endif %}{% endcapture %}
|
||||||
|
|
||||||
|
{% for node in nodes %}
|
||||||
|
{% if node == "" %}
|
||||||
|
{% continue %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% assign headerLevel = node | replace: '"', '' | slice: 0, 1 | times: 1 %}
|
||||||
|
|
||||||
|
{% if headerLevel < minHeader or headerLevel > maxHeader %}
|
||||||
|
{% continue %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if firstHeader %}
|
||||||
|
{% assign firstHeader = false %}
|
||||||
|
{% assign minHeader = headerLevel %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% assign indentAmount = headerLevel | minus: minHeader %}
|
||||||
|
{% assign _workspace = node | split: '</h' %}
|
||||||
|
|
||||||
|
{% assign _idWorkspace = _workspace[0] | split: 'id="' %}
|
||||||
|
{% assign _idWorkspace = _idWorkspace[1] | split: '"' %}
|
||||||
|
{% assign html_id = _idWorkspace[0] %}
|
||||||
|
|
||||||
|
{% assign _classWorkspace = _workspace[0] | split: 'class="' %}
|
||||||
|
{% assign _classWorkspace = _classWorkspace[1] | split: '"' %}
|
||||||
|
{% assign html_class = _classWorkspace[0] %}
|
||||||
|
|
||||||
|
{% if html_class contains "no_toc" %}
|
||||||
|
{% continue %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% capture _hAttrToStrip %}{{ _workspace[0] | split: '>' | first }}>{% endcapture %}
|
||||||
|
{% assign header = _workspace[0] | replace: _hAttrToStrip, '' %}
|
||||||
|
|
||||||
|
{% assign space = '' %}
|
||||||
|
{% for i in (1..indentAmount) %}
|
||||||
|
{% assign space = space | prepend: ' ' %}
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
{% unless include.item_class == blank %}
|
||||||
|
{% capture listItemClass %}{:.{{ include.item_class | replace: '%level%', headerLevel }}}{% endcapture %}
|
||||||
|
{% endunless %}
|
||||||
|
|
||||||
|
{% capture heading_body %}{% if include.sanitize %}{{ header | strip_html }}{% else %}{{ header }}{% endif %}{% endcapture %}
|
||||||
|
{% capture my_toc %}{{ my_toc }}
|
||||||
|
{{ space }}{{ listModifier }} {{ listItemClass }} [{{ heading_body | replace: "|", "\|" }}]({% if include.baseurl %}{{ include.baseurl }}{% endif %}#{{ html_id }}){% if include.anchor_class %}{:.{{ include.anchor_class }}}{% endif %}{% endcapture %}
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
{% if include.class %}
|
||||||
|
{% capture my_toc %}{:.{{ include.class }}}
|
||||||
|
{{ my_toc | lstrip }}{% endcapture %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if include.id %}
|
||||||
|
{% capture my_toc %}{: #{{ include.id }}}
|
||||||
|
{{ my_toc | lstrip }}{% endcapture %}
|
||||||
|
{% endif %}
|
||||||
|
{% endcapture %}{% assign tocWorkspace = '' %}{{ my_toc | markdownify | strip }}
|
24
docs/_includes/video
Normal file
24
docs/_includes/video
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
{% capture video_id %}{{ include.id }}{% endcapture %}
|
||||||
|
{% capture video_provider %}{{ include.provider }}{% endcapture %}
|
||||||
|
{% capture video_danmaku %}{{ include.danmaku | default: 0 }}{% endcapture %}
|
||||||
|
|
||||||
|
{% capture video_src %}
|
||||||
|
{% case video_provider %}
|
||||||
|
{% when "vimeo" %}
|
||||||
|
https://player.vimeo.com/video/{{ video_id }}?dnt=true
|
||||||
|
{% when "youtube" %}
|
||||||
|
https://www.youtube-nocookie.com/embed/{{ video_id }}
|
||||||
|
{% when "google-drive" %}
|
||||||
|
https://drive.google.com/file/d/{{ video_id }}/preview
|
||||||
|
{% when "bilibili" %}
|
||||||
|
https://player.bilibili.com/player.html?bvid={{ video_id }}&page=1&as_wide=1&high_quality=1&danmaku={{ video_danmaku }}
|
||||||
|
{% endcase %}
|
||||||
|
{% endcapture %}
|
||||||
|
{% assign video_src = video_src | strip %}
|
||||||
|
|
||||||
|
<!-- Courtesy of embedresponsively.com //-->
|
||||||
|
{% unless video_src == "" %}
|
||||||
|
<div class="responsive-video-container">
|
||||||
|
<iframe src="{{ video_src }}" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowfullscreen></iframe>
|
||||||
|
</div>
|
||||||
|
{% endunless %}
|
@ -1,24 +0,0 @@
|
|||||||
---
|
|
||||||
layout: archive
|
|
||||||
---
|
|
||||||
|
|
||||||
{{ content }}
|
|
||||||
|
|
||||||
|
|
||||||
{% if paginator %}
|
|
||||||
{% assign posts = paginator.posts %}
|
|
||||||
{% else %}
|
|
||||||
{% assign posts = site.posts %}
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
|
|
||||||
<h2>{{ site.data.ui-text[site.locale].recent_posts | default: "Recent Posts" }}</h2>
|
|
||||||
{% assign news = posts | where: "sneak_preview", "false" %}
|
|
||||||
{% for post in news %}
|
|
||||||
{% include archive-single.html %}
|
|
||||||
{% if post.image %}
|
|
||||||
<a href="{{ post.link }}"><img src="{{ post.image }}"></a>
|
|
||||||
{% endif %}
|
|
||||||
{% endfor %}
|
|
||||||
|
|
||||||
{% include paginator.html %}
|
|
82
docs/_layouts/single-full.html
Normal file
82
docs/_layouts/single-full.html
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
---
|
||||||
|
layout: default
|
||||||
|
---
|
||||||
|
|
||||||
|
{% if page.header.overlay_color or page.header.overlay_image or page.header.image %}
|
||||||
|
{% include page__hero.html %}
|
||||||
|
{% elsif page.header.video.id and page.header.video.provider %}
|
||||||
|
{% include page__hero_video.html %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<div id="main" role="main">
|
||||||
|
|
||||||
|
<article class="page" itemscope itemtype="https://schema.org/CreativeWork" style="margin: 0 auto;float:none;">
|
||||||
|
{% if page.title %}<meta itemprop="headline" content="{{ page.title | markdownify | strip_html | strip_newlines | escape_once }}">{% endif %}
|
||||||
|
{% if page.excerpt %}<meta itemprop="description" content="{{ page.excerpt | markdownify | strip_html | strip_newlines | escape_once }}">{% endif %}
|
||||||
|
{% if page.date %}<meta itemprop="datePublished" content="{{ page.date | date_to_xmlschema }}">{% endif %}
|
||||||
|
{% if page.last_modified_at %}<meta itemprop="dateModified" content="{{ page.last_modified_at | date_to_xmlschema }}">{% endif %}
|
||||||
|
|
||||||
|
<div class="page__inner-wrap">
|
||||||
|
{% unless page.header.overlay_color or page.header.overlay_image %}
|
||||||
|
<header>
|
||||||
|
{% if page.title %}<h1 id="page-title" class="page__title" itemprop="headline">{{ page.title | markdownify | remove: "<p>" | remove: "</p>" }}</h1>{% endif %}
|
||||||
|
{% include page__meta.html %}
|
||||||
|
</header>
|
||||||
|
{% endunless %}
|
||||||
|
|
||||||
|
<section class="page__content" itemprop="text">
|
||||||
|
{% if page.toc %}
|
||||||
|
<aside class="sidebar__right {% if page.toc_sticky %}sticky{% endif %}">
|
||||||
|
<nav class="toc">
|
||||||
|
<header><h4 class="nav__title"><i class="fas fa-{{ page.toc_icon | default: 'file-alt' }}"></i> {{ page.toc_label | default: site.data.ui-text[site.locale].toc_label | default: "On this page" }}</h4></header>
|
||||||
|
{% include toc.html sanitize=true html=content h_min=1 h_max=6 class="toc__menu" %}
|
||||||
|
</nav>
|
||||||
|
</aside>
|
||||||
|
{% endif %}
|
||||||
|
{{ content }}
|
||||||
|
{% if page.link %}<div><a href="{{ page.link }}" class="btn btn--primary">{{ site.data.ui-text[site.locale].ext_link_label | default: "Direct Link" }}</a></div>{% endif %}
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<footer class="page__meta">
|
||||||
|
{% if site.data.ui-text[site.locale].meta_label %}
|
||||||
|
<h4 class="page__meta-title">{{ site.data.ui-text[site.locale].meta_label }}</h4>
|
||||||
|
{% endif %}
|
||||||
|
{% include page__taxonomy.html %}
|
||||||
|
{% include page__date.html %}
|
||||||
|
</footer>
|
||||||
|
|
||||||
|
{% if page.share %}{% include social-share.html %}{% endif %}
|
||||||
|
|
||||||
|
{% include post_pagination.html %}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{% if jekyll.environment == 'production' and site.comments.provider and page.comments %}
|
||||||
|
{% include comments.html %}
|
||||||
|
{% endif %}
|
||||||
|
</article>
|
||||||
|
|
||||||
|
{% comment %}<!-- only show related on a post page when `related: true` -->{% endcomment %}
|
||||||
|
{% if page.id and page.related and site.related_posts.size > 0 %}
|
||||||
|
<div class="page__related">
|
||||||
|
<h4 class="page__related-title">{{ site.data.ui-text[site.locale].related_label | default: "You May Also Enjoy" }}</h4>
|
||||||
|
<div class="grid__wrapper">
|
||||||
|
{% for post in site.related_posts limit:4 %}
|
||||||
|
{% include archive-single.html type="grid" %}
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% comment %}<!-- otherwise show recent posts if no related when `related: true` -->{% endcomment %}
|
||||||
|
{% elsif page.id and page.related %}
|
||||||
|
<div class="page__related">
|
||||||
|
<h4 class="page__related-title">{{ site.data.ui-text[site.locale].related_label | default: "You May Also Enjoy" }}</h4>
|
||||||
|
<div class="grid__wrapper">
|
||||||
|
{% for post in site.posts limit:4 %}
|
||||||
|
{% if post.id == page.id %}
|
||||||
|
{% continue %}
|
||||||
|
{% endif %}
|
||||||
|
{% include archive-single.html type="grid" %}
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
49
docs/_pages/posts-landing.md
Normal file
49
docs/_pages/posts-landing.md
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
---
|
||||||
|
title: "Blog"
|
||||||
|
layout: archive
|
||||||
|
permalink: /posts/
|
||||||
|
---
|
||||||
|
|
||||||
|
{% if paginator %}
|
||||||
|
{% assign posts = paginator.posts %}
|
||||||
|
{% else %}
|
||||||
|
{% assign posts = site.posts %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<script type="text/javascript">
|
||||||
|
function filterUsingCategory(selectedCategory) {
|
||||||
|
{% for post in posts %}
|
||||||
|
var cats = {{ post.tags | jsonify }}
|
||||||
|
|
||||||
|
var postDiv = document.getElementById("post-{{post.title | slugify}}");
|
||||||
|
postDiv.style.display = (selectedCategory == 'All' || cats.includes(selectedCategory))
|
||||||
|
? 'unset'
|
||||||
|
: 'none';
|
||||||
|
{% endfor %}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<div class="btn-group">
|
||||||
|
<button id="All" class="button-71" role="button" onclick="filterUsingCategory('All')">All ({{ posts.size }})</button>
|
||||||
|
{% assign tags = site.tags | sort %}
|
||||||
|
{% for category in tags %}
|
||||||
|
{% assign cat = category | first %}
|
||||||
|
<button id="{{ cat }}" class="button-71" role="button" onclick="filterUsingCategory(this.id)">{{ cat }} ({{ site.tags[cat].size }})</button>
|
||||||
|
{% endfor %}
|
||||||
|
<hr />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="posts-wrapper">
|
||||||
|
{% for post in posts %}
|
||||||
|
<div class="post" id="post-{{post.title | slugify}}">
|
||||||
|
<p class="itemInteriorSection">
|
||||||
|
{%- unless post.hidden -%}
|
||||||
|
{% include archive-single.html %}
|
||||||
|
{% if post.image %}
|
||||||
|
<a href="{{ post.link }}"><img src="{{ post.image }}"></a>
|
||||||
|
{% endif %}
|
||||||
|
{%- endunless -%}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
36
docs/_pages/posts_list_landing.md
Normal file
36
docs/_pages/posts_list_landing.md
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
---
|
||||||
|
layout: archive
|
||||||
|
permalink: /posts-list/
|
||||||
|
---
|
||||||
|
|
||||||
|
{% assign sorted_tags = (site.tags | sort:0) %}
|
||||||
|
<ul class="tag-box">
|
||||||
|
{% for tag in sorted_tags %}
|
||||||
|
{% assign t = tag | first %}
|
||||||
|
{% assign ps = tag | last %}
|
||||||
|
<li><a href="#{{ t | downcase }}">{{ t }} <span class="size">({{ ps.size }})</span></a></li>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
{% for tag in sorted_tags %}
|
||||||
|
{% assign t = tag | first %}
|
||||||
|
{% assign posts = tag | last %}
|
||||||
|
<div style="text-transform:capitalize;">
|
||||||
|
<h4 id="{{ t | downcase }}">{{ t }}</h4>
|
||||||
|
</div>
|
||||||
|
<ul>
|
||||||
|
{% for post in posts %}
|
||||||
|
{% if post.tags contains t %}
|
||||||
|
{% if post.link %}
|
||||||
|
<li>
|
||||||
|
<span class="date">{{ post.date | date: '%d %b %y' }}</span>: <a href="{{ post.link }}">{{ post.title }}</a>
|
||||||
|
</li>
|
||||||
|
{% else %}
|
||||||
|
<li>
|
||||||
|
<span class="date">{{ post.date | date: '%d %b %y' }}</span>: <a href="{{ post.url }}">{{ post.title }}</a>
|
||||||
|
</li>
|
||||||
|
{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
{% endfor %}
|
@ -1,6 +1,49 @@
|
|||||||
---
|
---
|
||||||
title: "Tutorials"
|
title: "Tutorials"
|
||||||
layout: collection
|
layout: archive
|
||||||
collection: tutorials
|
collection: tutorials
|
||||||
permalink: /tutorials/
|
permalink: /tutorials/
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
||||||
|
{% if paginator %}
|
||||||
|
{% assign tutorials = paginator.tutorials %}
|
||||||
|
{% else %}
|
||||||
|
{% assign tutorials = site.tutorials %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<script type="text/javascript">
|
||||||
|
function filterTutorialsUsingCategory(selectedCategory) {
|
||||||
|
{% for tutorial in tutorials %}
|
||||||
|
var cats = {{ tutorial.tags | jsonify }}
|
||||||
|
var tutorialDiv = document.getElementById("tutorial-{{tutorial.title | slugify}}");
|
||||||
|
tutorialDiv.style.display = (selectedCategory == 'All' || cats.includes(selectedCategory))
|
||||||
|
? 'unset'
|
||||||
|
: 'none';
|
||||||
|
{% endfor %}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<div class="btn-group">
|
||||||
|
<button id="All" class="button-71" role="button" onclick="filterTutorialsUsingCategory('All')">All ({{ tutorials.size }})</button>
|
||||||
|
{% assign tags = site.tutorials | map: 'tags' | join: ',' | split: ',' | group_by: tag %}
|
||||||
|
{% for cat in tags %} <!-- of the form {"name":"","items":[],"size":N}-->
|
||||||
|
<button id="{{ cat.name }}" class="button-71" role="button" onclick="filterTutorialsUsingCategory(this.id)">{{ cat.name }} ({{ cat.size }})</button>
|
||||||
|
{% endfor %}
|
||||||
|
<hr />
|
||||||
|
</div>
|
||||||
|
<div class="tutorials-wrapper">
|
||||||
|
{% for tutorial in tutorials %}
|
||||||
|
{% assign post = tutorial %}
|
||||||
|
<div class="tutorial" id="tutorial-{{tutorial.title | slugify}}">
|
||||||
|
<p class="itemInteriorSection">
|
||||||
|
{%- unless tutorial.hidden -%}
|
||||||
|
{% include archive-single.html %}
|
||||||
|
{% if tutorial.image %}
|
||||||
|
<a href="{{ tutorial.link }}"><img src="{{ tutorial.image }}"></a>
|
||||||
|
{% endif %}
|
||||||
|
{%- endunless -%}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
@ -1,8 +1,7 @@
|
|||||||
---
|
---
|
||||||
layout: single
|
|
||||||
title: "ZeRO & DeepSpeed: New system optimizations enable training models with over 100 billion parameters"
|
title: "ZeRO & DeepSpeed: New system optimizations enable training models with over 100 billion parameters"
|
||||||
date: 2020-02-13
|
date: 2020-02-13
|
||||||
link: https://www.microsoft.com/en-us/research/blog/zero-deepspeed-new-system-optimizations-enable-training-models-with-over-100-billion-parameters/
|
link: https://www.microsoft.com/en-us/research/blog/ZeRO-deepspeed-new-system-optimizations-enable-training-models-with-over-100-billion-parameters/
|
||||||
excerpt: "Developed by Microsoft AI & Research."
|
excerpt: ""
|
||||||
categories: news
|
tags: training ZeRO
|
||||||
---
|
---
|
||||||
|
@ -1,8 +1,7 @@
|
|||||||
---
|
---
|
||||||
layout: single
|
|
||||||
title: "Turing-NLG: A 17-billion-parameter language model by Microsoft"
|
title: "Turing-NLG: A 17-billion-parameter language model by Microsoft"
|
||||||
date: 2020-02-13
|
date: 2020-02-13
|
||||||
link: https://www.microsoft.com/en-us/research/blog/turing-nlg-a-17-billion-parameter-language-model-by-microsoft/
|
link: https://www.microsoft.com/en-us/research/blog/turing-nlg-a-17-billion-parameter-language-model-by-microsoft/
|
||||||
excerpt: "DeepSpeed was used to train the world's largest language model."
|
excerpt: "DeepSpeed was used to train the world's largest language model."
|
||||||
categories: news
|
tags: training
|
||||||
---
|
---
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
---
|
---
|
||||||
layout: single
|
|
||||||
title: "The Fastest and Most Efficient BERT Training through Optimized Transformer Kernels"
|
title: "The Fastest and Most Efficient BERT Training through Optimized Transformer Kernels"
|
||||||
excerpt: ""
|
excerpt: ""
|
||||||
categories: news
|
tags: training
|
||||||
new_post: true
|
|
||||||
date: 2020-05-19 00:00:00
|
date: 2020-05-19 00:00:00
|
||||||
|
toc: false
|
||||||
|
tags: training
|
||||||
---
|
---
|
||||||
|
|
||||||
We introduce new technology to accelerate single GPU performance via kernel
|
We introduce new technology to accelerate single GPU performance via kernel
|
||||||
@ -17,7 +17,7 @@ DeepSpeed achieves the fastest BERT training record: 44 minutes on 1,024
|
|||||||
NVIDIA V100 GPUs**, compared with the best published result of 67 minutes on
|
NVIDIA V100 GPUs**, compared with the best published result of 67 minutes on
|
||||||
the same number and generation of GPUs.
|
the same number and generation of GPUs.
|
||||||
|
|
||||||
* Brief overview, see our [press release](https://www.microsoft.com/en-us/research/blog/zero-2-deepspeed-shattering-barriers-of-deep-learning-speed-scale/).
|
* Brief overview, see our [press release](https://www.microsoft.com/en-us/research/blog/ZeRO-2-deepspeed-shattering-barriers-of-deep-learning-speed-scale/).
|
||||||
* Detailed technology deep dive, see our [blog post](https://www.deepspeed.ai/news/2020/05/27/fastest-bert-training.html).
|
* Detailed technology deep dive, see our [blog post](https://www.deepspeed.ai/news/2020/05/27/fastest-bert-training.html).
|
||||||
* Tutorial on how to reproduce our results, see our [BERT pre-training tutorial](https://www.deepspeed.ai/tutorials/bert-pretraining/).
|
* Tutorial on how to reproduce our results, see our [BERT pre-training tutorial](https://www.deepspeed.ai/tutorials/bert-pretraining/).
|
||||||
* The source code for our transformer kernels can be found in the [DeepSpeed repo](https://github.com/microsoft/deepspeed) and BERT pre-training code can be found in the [DeepSpeedExamples repo](https://github.com/microsoft/deepspeedexamples).
|
* The source code for our transformer kernels can be found in the [DeepSpeed repo](https://github.com/microsoft/deepspeed) and BERT pre-training code can be found in the [DeepSpeedExamples repo](https://github.com/microsoft/deepspeedexamples).
|
||||||
|
@ -1,9 +1,7 @@
|
|||||||
---
|
---
|
||||||
layout: single
|
|
||||||
title: "ZeRO-2 & DeepSpeed: Shattering Barriers of Deep Learning Speed & Scale"
|
title: "ZeRO-2 & DeepSpeed: Shattering Barriers of Deep Learning Speed & Scale"
|
||||||
excerpt: ""
|
excerpt: ""
|
||||||
link: https://www.microsoft.com/en-us/research/blog/zero-2-deepspeed-shattering-barriers-of-deep-learning-speed-scale/
|
link: https://www.microsoft.com/en-us/research/blog/ZeRO-2-deepspeed-shattering-barriers-of-deep-learning-speed-scale/
|
||||||
categories: news
|
tags: training ZeRO
|
||||||
new_post: false
|
|
||||||
date: 2020-05-19 02:00:00
|
date: 2020-05-19 02:00:00
|
||||||
---
|
---
|
||||||
|
@ -1,10 +1,9 @@
|
|||||||
---
|
---
|
||||||
layout: single
|
|
||||||
title: "An Order-of-Magnitude Larger and Faster Training with ZeRO-2"
|
title: "An Order-of-Magnitude Larger and Faster Training with ZeRO-2"
|
||||||
excerpt: ""
|
excerpt: ""
|
||||||
categories: news
|
tags: training ZeRO
|
||||||
new_post: false
|
|
||||||
date: 2020-05-19 01:00:00
|
date: 2020-05-19 01:00:00
|
||||||
|
toc: false
|
||||||
---
|
---
|
||||||
|
|
||||||
ZeRO-2 expands the scope of memory optimizations in the original ZeRO by
|
ZeRO-2 expands the scope of memory optimizations in the original ZeRO by
|
||||||
@ -17,7 +16,7 @@ learning training by an order of magnitude. More concretely, ZeRO-2 allows
|
|||||||
training models as large as 170 billion parameters up to 10x faster compared
|
training models as large as 170 billion parameters up to 10x faster compared
|
||||||
to state of the art.
|
to state of the art.
|
||||||
|
|
||||||
For more information on ZeRO-2, see our [blog post](https://www.microsoft.com/en-us/research/blog/zero-2-deepspeed-shattering-barriers-of-deep-learning-speed-scale/).
|
For more information on ZeRO-2, see our [blog post](https://www.microsoft.com/en-us/research/blog/ZeRO-2-deepspeed-shattering-barriers-of-deep-learning-speed-scale/).
|
||||||
|
|
||||||
For more information on how to use ZeRO-2, see an example of training GPT family of models in this [tutorial](/tutorials/megatron/).
|
For more information on how to use ZeRO-2, see an example of training GPT family of models in this [tutorial](/tutorials/megatron/).
|
||||||
|
|
||||||
|
@ -1,9 +1,7 @@
|
|||||||
---
|
---
|
||||||
layout: single
|
|
||||||
title: "Microsoft DeepSpeed achieves the fastest BERT training time"
|
title: "Microsoft DeepSpeed achieves the fastest BERT training time"
|
||||||
excerpt: ""
|
excerpt: ""
|
||||||
categories: news
|
tags: training
|
||||||
new_post: false
|
|
||||||
date: 2020-05-28 00:00:00
|
date: 2020-05-28 00:00:00
|
||||||
---
|
---
|
||||||
|
|
||||||
|
@ -1,10 +1,8 @@
|
|||||||
---
|
---
|
||||||
layout: single
|
|
||||||
title: "DeepSpeed Microsoft Research Webinar on August 6th, 2020"
|
title: "DeepSpeed Microsoft Research Webinar on August 6th, 2020"
|
||||||
excerpt: ""
|
excerpt: ""
|
||||||
categories: news
|
tags: presentations
|
||||||
link: https://note.microsoft.com/MSR-Webinar-DeepSpeed-Registration-On-Demand.html
|
link: https://note.microsoft.com/MSR-Webinar-DeepSpeed-Registration-On-Demand.html
|
||||||
image: /assets/images/webinar-aug2020.png
|
image: /assets/images/webinar-aug2020.png
|
||||||
new_post: true
|
|
||||||
date: 2020-07-24 00:00:00
|
date: 2020-07-24 00:00:00
|
||||||
---
|
---
|
||||||
|
@ -1,9 +1,7 @@
|
|||||||
---
|
---
|
||||||
layout: single
|
|
||||||
title: "DeepSpeed Microsoft Research Webinar is now on-demand"
|
title: "DeepSpeed Microsoft Research Webinar is now on-demand"
|
||||||
excerpt: ""
|
excerpt: ""
|
||||||
categories: news
|
tags: presentations
|
||||||
link: https://note.microsoft.com/MSR-Webinar-DeepSpeed-Registration-On-Demand.html
|
link: https://note.microsoft.com/MSR-Webinar-DeepSpeed-Registration-On-Demand.html
|
||||||
new_post: true
|
|
||||||
date: 2020-08-07 00:00:00
|
date: 2020-08-07 00:00:00
|
||||||
---
|
---
|
||||||
|
@ -1,10 +1,9 @@
|
|||||||
---
|
---
|
||||||
layout: single
|
|
||||||
title: "Powering 10x longer sequences and 6x faster execution through DeepSpeed Sparse Attention"
|
title: "Powering 10x longer sequences and 6x faster execution through DeepSpeed Sparse Attention"
|
||||||
excerpt: ""
|
excerpt: ""
|
||||||
categories: news
|
tags: training
|
||||||
new_post: true
|
|
||||||
date: 2020-09-09 00:00:00
|
date: 2020-09-09 00:00:00
|
||||||
|
toc: false
|
||||||
---
|
---
|
||||||
|
|
||||||
DeepSpeed offers sparse attention kernels, an instrumental technology to support long sequences of model inputs, whether for text, image, or sound. Compared with the classic dense Transformers, it powers an order-of-magnitude longer input sequence and obtains up to 6x faster execution with comparable accuracy. It also outperforms state-of-the-art sparse implementations with 1.5-3x faster execution. Furthermore, our sparse kernels support efficient execution of flexible sparse format and empower users to innovate on their custom sparse structures.
|
DeepSpeed offers sparse attention kernels, an instrumental technology to support long sequences of model inputs, whether for text, image, or sound. Compared with the classic dense Transformers, it powers an order-of-magnitude longer input sequence and obtains up to 6x faster execution with comparable accuracy. It also outperforms state-of-the-art sparse implementations with 1.5-3x faster execution. Furthermore, our sparse kernels support efficient execution of flexible sparse format and empower users to innovate on their custom sparse structures.
|
||||||
|
@ -1,14 +1,13 @@
|
|||||||
---
|
---
|
||||||
layout: single
|
|
||||||
title: "10x bigger model training on a single GPU with ZeRO-Offload"
|
title: "10x bigger model training on a single GPU with ZeRO-Offload"
|
||||||
excerpt: ""
|
excerpt: ""
|
||||||
categories: news
|
|
||||||
new_post: true
|
|
||||||
date: 2020-09-09 00:00:00
|
date: 2020-09-09 00:00:00
|
||||||
|
tags: training ZeRO
|
||||||
|
toc: false
|
||||||
---
|
---
|
||||||
|
|
||||||
We introduce a new technology called ZeRO-Offload to enable **10X bigger model training on a single GPU**. ZeRO-Offload extends ZeRO-2 to leverage both CPU and GPU memory for training large models. Using a machine with **a single GPU**, our users now can run **models of up to 13 billion parameters** without running out of memory, 10x bigger than the existing approaches, while obtaining competitive throughput. This feature democratizes multi-billion-parameter model training and opens the window for many deep learning practitioners to explore bigger and better models.
|
We introduce a new technology called ZeRO-Offload to enable **10X bigger model training on a single GPU**. ZeRO-Offload extends ZeRO-2 to leverage both CPU and GPU memory for training large models. Using a machine with **a single GPU**, our users now can run **models of up to 13 billion parameters** without running out of memory, 10x bigger than the existing approaches, while obtaining competitive throughput. This feature democratizes multi-billion-parameter model training and opens the window for many deep learning practitioners to explore bigger and better models.
|
||||||
|
|
||||||
* For more information on ZeRO-Offload, see our [press release]( {{ site.press_release_v3 }} ).
|
* For more information on ZeRO-Offload, see our [press release]( {{ site.press_release_v3 }} ).
|
||||||
* For more information on how to use ZeRO-Offload, see our [ZeRO-Offload tutorial](https://www.deepspeed.ai/tutorials/zero-offload/).
|
* For more information on how to use ZeRO-Offload, see our [ZeRO-Offload tutorial](https://www.deepspeed.ai/tutorials/ZeRO-offload/).
|
||||||
* The source code for ZeRO-Offload can be found in the [DeepSpeed repo](https://github.com/microsoft/deepspeed).
|
* The source code for ZeRO-Offload can be found in the [DeepSpeed repo](https://github.com/microsoft/deepspeed).
|
||||||
|
@ -1,10 +1,8 @@
|
|||||||
---
|
---
|
||||||
layout: single
|
|
||||||
title: "DeepSpeed with 1-bit Adam: 5x less communication and 3.4x faster training"
|
title: "DeepSpeed with 1-bit Adam: 5x less communication and 3.4x faster training"
|
||||||
excerpt: ""
|
excerpt: ""
|
||||||
categories: news
|
|
||||||
new_post: false
|
|
||||||
date: 2020-09-09 00:00:00
|
date: 2020-09-09 00:00:00
|
||||||
|
tags: training
|
||||||
---
|
---
|
||||||
|
|
||||||
## 1. Introduction
|
## 1. Introduction
|
||||||
|
@ -1,10 +1,9 @@
|
|||||||
---
|
---
|
||||||
layout: single
|
|
||||||
title: "Up to 5x less communication and 3.4x faster training through 1-bit Adam"
|
title: "Up to 5x less communication and 3.4x faster training through 1-bit Adam"
|
||||||
excerpt: ""
|
excerpt: ""
|
||||||
categories: news
|
|
||||||
new_post: true
|
|
||||||
date: 2020-09-09 00:00:00
|
date: 2020-09-09 00:00:00
|
||||||
|
tags: training
|
||||||
|
toc: false
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,10 +1,8 @@
|
|||||||
---
|
---
|
||||||
layout: single
|
|
||||||
title: "Training a Trillion Parameters with Pipeline Parallelism"
|
title: "Training a Trillion Parameters with Pipeline Parallelism"
|
||||||
excerpt: ""
|
excerpt: ""
|
||||||
categories: news
|
|
||||||
new_post: true
|
|
||||||
date: 2020-09-09 00:00:00
|
date: 2020-09-09 00:00:00
|
||||||
|
tags: training
|
||||||
---
|
---
|
||||||
|
|
||||||
DeepSpeed includes new support for pipeline parallelism! DeepSpeed's training
|
DeepSpeed includes new support for pipeline parallelism! DeepSpeed's training
|
||||||
|
@ -1,10 +1,8 @@
|
|||||||
---
|
---
|
||||||
layout: single
|
|
||||||
title: "DeepSpeed Sparse Attention"
|
title: "DeepSpeed Sparse Attention"
|
||||||
excerpt: ""
|
excerpt: ""
|
||||||
categories: news
|
|
||||||
new_post: true
|
|
||||||
date: 2020-09-09 01:00:00
|
date: 2020-09-09 01:00:00
|
||||||
|
tags: training inference
|
||||||
---
|
---
|
||||||
|
|
||||||
Attention-based deep learning models such as the transformers are highly effective in capturing relationship between tokens in an input sequence, even across long distances. As a result, they are used with text, image, and sound-based inputs, where the sequence length can be in thousands of tokens. However, despite the effectiveness of attention modules to capture long term dependencies, in practice, their application to long sequence input is limited by compute and memory requirements of the attention computation that grow quadratically, `O(n^2)`, with the sequence length `n`.
|
Attention-based deep learning models such as the transformers are highly effective in capturing relationship between tokens in an input sequence, even across long distances. As a result, they are used with text, image, and sound-based inputs, where the sequence length can be in thousands of tokens. However, despite the effectiveness of attention modules to capture long term dependencies, in practice, their application to long sequence input is limited by compute and memory requirements of the attention computation that grow quadratically, `O(n^2)`, with the sequence length `n`.
|
||||||
|
@ -1,10 +1,9 @@
|
|||||||
---
|
---
|
||||||
layout: single
|
|
||||||
title: "Progressive Layer Dropping"
|
title: "Progressive Layer Dropping"
|
||||||
excerpt: ""
|
excerpt: ""
|
||||||
categories: news
|
|
||||||
new_post: true
|
|
||||||
date: 2020-10-29 00:00:00
|
date: 2020-10-29 00:00:00
|
||||||
|
tags: training
|
||||||
|
toc: false
|
||||||
---
|
---
|
||||||
|
|
||||||
We introduce a new technology called progressive layer dropping (PLD) to speedup the pre-training of Transformer-based networks through efficient and robust compressed training. The pre-training step of Transformer networks often suffer from unbearable overall computational expenses. We analyze the training dynamics and stability of Transformer networks and propose PLD to sparsely update Transformer blocks following a progressive dropping schedule, which smoothly increases the layer dropping rate for each mini-batch as training evolves along both the temporal and the model depth dimension. PLD is able to allow the pre-training to be **2.5X faster** to get similar accuracy on downstream tasks and allows the training to be **24% faster** when training the same number of samples, not at the cost of excessive hardware resources.
|
We introduce a new technology called progressive layer dropping (PLD) to speedup the pre-training of Transformer-based networks through efficient and robust compressed training. The pre-training step of Transformer networks often suffer from unbearable overall computational expenses. We analyze the training dynamics and stability of Transformer networks and propose PLD to sparsely update Transformer blocks following a progressive dropping schedule, which smoothly increases the layer dropping rate for each mini-batch as training evolves along both the temporal and the model depth dimension. PLD is able to allow the pre-training to be **2.5X faster** to get similar accuracy on downstream tasks and allows the training to be **24% faster** when training the same number of samples, not at the cost of excessive hardware resources.
|
||||||
|
@ -1,10 +1,8 @@
|
|||||||
---
|
---
|
||||||
layout: single
|
|
||||||
title: "DeepSpeed ZeRO-3 Offload"
|
title: "DeepSpeed ZeRO-3 Offload"
|
||||||
excerpt: ""
|
excerpt: ""
|
||||||
categories: news
|
|
||||||
new_post: true
|
|
||||||
date: 2021-03-08 00:00:00
|
date: 2021-03-08 00:00:00
|
||||||
|
tags: training ZeRO
|
||||||
---
|
---
|
||||||
Today we are announcing the release of ZeRO-3 Offload, a highly efficient and easy to use implementation of ZeRO Stage 3 and ZeRO Offload combined, geared towards our continued goal of democratizing AI by making efficient large-scale DL training available to everyone. The key benefits of ZeRO-3 Offload are:
|
Today we are announcing the release of ZeRO-3 Offload, a highly efficient and easy to use implementation of ZeRO Stage 3 and ZeRO Offload combined, geared towards our continued goal of democratizing AI by making efficient large-scale DL training available to everyone. The key benefits of ZeRO-3 Offload are:
|
||||||
|
|
||||||
@ -19,7 +17,7 @@ Today we are announcing the release of ZeRO-3 Offload, a highly efficient and ea
|
|||||||
|
|
||||||
<h2> Overview of ZeRO family of technology </h2>
|
<h2> Overview of ZeRO family of technology </h2>
|
||||||
|
|
||||||
The Zero Redundancy Optimizer (abbreviated ZeRO) is a family of memory optimization technologies for large-scale distributed deep learning. Unlike data parallelism (that is efficient but can only support a limited model size) or model parallelism (that can support larger model sizes but requires significant code refactoring while adding communication overhead that limits efficiency), ZeRO allows fitting larger models in memory without requiring code refactoring while remaining very efficient. ZeRO does so by eliminating the memory redundancy that is inherent in data parallelism while limiting the communication overhead to a minimum.
|
The ZeRO Redundancy Optimizer (abbreviated ZeRO) is a family of memory optimization technologies for large-scale distributed deep learning. Unlike data parallelism (that is efficient but can only support a limited model size) or model parallelism (that can support larger model sizes but requires significant code refactoring while adding communication overhead that limits efficiency), ZeRO allows fitting larger models in memory without requiring code refactoring while remaining very efficient. ZeRO does so by eliminating the memory redundancy that is inherent in data parallelism while limiting the communication overhead to a minimum.
|
||||||
ZeRO removes the memory redundancies across data-parallel processes by partitioning the three model states (optimizer states, gradients, and parameters) across data-parallel processes instead of replicating them. By doing this, it boosts memory efficiency compared to classic data-parallelism while retaining its computational granularity and communication efficiency.
|
ZeRO removes the memory redundancies across data-parallel processes by partitioning the three model states (optimizer states, gradients, and parameters) across data-parallel processes instead of replicating them. By doing this, it boosts memory efficiency compared to classic data-parallelism while retaining its computational granularity and communication efficiency.
|
||||||
There are three stages in ZeRO corresponding to three model states, as shown in the Figure 1: the first stage (ZeRO-1) partitions only the optimizer states, the second stage (ZeRO-2) partitions both the optimizer states and the gradients and the final stage (ZeRO-3) partitions all three model states (for more details see the ZeRO [paper](https://arxiv.org/abs/1910.02054v3)).
|
There are three stages in ZeRO corresponding to three model states, as shown in the Figure 1: the first stage (ZeRO-1) partitions only the optimizer states, the second stage (ZeRO-2) partitions both the optimizer states and the gradients and the final stage (ZeRO-3) partitions all three model states (for more details see the ZeRO [paper](https://arxiv.org/abs/1910.02054v3)).
|
||||||
|
|
||||||
@ -30,8 +28,8 @@ Figure 1. Overview of ZeRO memory savings
|
|||||||
|
|
||||||
In addition to these three stages, ZeRO family of technology also consists of ZeRO-2 Offload. ZeRO-2 Offload is a heterogeneous DL training technology that works in conjunction with ZeRO-2 to offload partitioned optimizer states and gradients to CPU memory. ZeRO-2 Offload offers the full memory advantage of ZeRO-2 even on a single GPU, while at the same time offering great scalability of ZeRO-2 on multi-GPU setup. DeepSpeed library has been offering ZeRO-2 Offload since Sept 2020. For details, please see below:
|
In addition to these three stages, ZeRO family of technology also consists of ZeRO-2 Offload. ZeRO-2 Offload is a heterogeneous DL training technology that works in conjunction with ZeRO-2 to offload partitioned optimizer states and gradients to CPU memory. ZeRO-2 Offload offers the full memory advantage of ZeRO-2 even on a single GPU, while at the same time offering great scalability of ZeRO-2 on multi-GPU setup. DeepSpeed library has been offering ZeRO-2 Offload since Sept 2020. For details, please see below:
|
||||||
|
|
||||||
* ZeRO: [Stage 1 blog](https://www.microsoft.com/en-us/research/blog/zero-2-deepspeed-shattering-barriers-of-deep-learning-speed-scale/), [Stage 2 blog](https://www.microsoft.com/en-us/research/blog/zero-2-deepspeed-shattering-barriers-of-deep-learning-speed-scale/), [Tutorial](/tutorials/zero)
|
* ZeRO: [Stage 1 blog](https://www.microsoft.com/en-us/research/blog/ZeRO-2-deepspeed-shattering-barriers-of-deep-learning-speed-scale/), [Stage 2 blog](https://www.microsoft.com/en-us/research/blog/ZeRO-2-deepspeed-shattering-barriers-of-deep-learning-speed-scale/), [Tutorial](/tutorials/ZeRO)
|
||||||
* ZeRO-Offload: [Blog](https://www.microsoft.com/en-us/research/blog/deepspeed-extreme-scale-model-training-for-everyone/#toc-heading-3), [Tutorials](/tutorials/zero-offload), [Paper link](https://arxiv.org/abs/2101.06840)
|
* ZeRO-Offload: [Blog](https://www.microsoft.com/en-us/research/blog/deepspeed-extreme-scale-model-training-for-everyone/#toc-heading-3), [Tutorials](/tutorials/ZeRO-offload), [Paper link](https://arxiv.org/abs/2101.06840)
|
||||||
|
|
||||||
<h2>ZeRO-3 Offload</h2>
|
<h2>ZeRO-3 Offload</h2>
|
||||||
With today’s release of ZeRO-3 Offload, we are adding support for partitioning and offloading parameters in addition to optimizer states and gradients partitioning already supported by ZeRO-2 Offload in DeepSpeed. With parameter partitioning ZeRO-3 Offload implements the full set of features in the three stages of ZeRO, that allows for a linear growth in model size with the number of GPUs. In addition, ZeRO-3 Offload can also optionally offload all these model states to CPU to further reduce GPU memory consumption, leveraging both CPU and GPU to maximize memory and compute efficiency of the entire system.
|
With today’s release of ZeRO-3 Offload, we are adding support for partitioning and offloading parameters in addition to optimizer states and gradients partitioning already supported by ZeRO-2 Offload in DeepSpeed. With parameter partitioning ZeRO-3 Offload implements the full set of features in the three stages of ZeRO, that allows for a linear growth in model size with the number of GPUs. In addition, ZeRO-3 Offload can also optionally offload all these model states to CPU to further reduce GPU memory consumption, leveraging both CPU and GPU to maximize memory and compute efficiency of the entire system.
|
||||||
@ -95,6 +93,6 @@ If you are already a DeepSpeed user, you can find our detailed tutorial on ZeRO-
|
|||||||
|
|
||||||
* DeepSpeed: [Getting Started Page](/getting-started/)
|
* DeepSpeed: [Getting Started Page](/getting-started/)
|
||||||
|
|
||||||
* ZeRO-3 Offload [Documentation](https://deepspeed.readthedocs.io/en/latest/zero3.html), [Tutorial](/tutorials/zero/#training-trillion-scale-models-with-zero-3-offload)
|
* ZeRO-3 Offload [Documentation](https://deepspeed.readthedocs.io/en/latest/zero3.html), [Tutorial](/tutorials/ZeRO/#training-trillion-scale-models-with-ZeRO-3-offload)
|
||||||
|
|
||||||
The DeepSpeed Team is very excited to share ZeRO-3 Offload with the DL community.
|
The DeepSpeed Team is very excited to share ZeRO-3 Offload with the DL community.
|
||||||
|
@ -1,10 +1,8 @@
|
|||||||
---
|
---
|
||||||
layout: single
|
|
||||||
title: "Mixture-of-Quantization: A novel quantization approach for reducing model size with minimal accuracy impact"
|
title: "Mixture-of-Quantization: A novel quantization approach for reducing model size with minimal accuracy impact"
|
||||||
excerpt: ""
|
excerpt: ""
|
||||||
categories: news
|
date: 2021-05-05 00:00:00
|
||||||
new_post: false
|
tags: inference
|
||||||
date: 2020-05-28 00:00:00
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## A unified suite for quantization-aware training and inference
|
## A unified suite for quantization-aware training and inference
|
||||||
|
@ -1,10 +1,8 @@
|
|||||||
---
|
---
|
||||||
layout: single
|
|
||||||
title: "DeepSpeed Inference: Multi-GPU inference with customized inference kernels and quantization support"
|
title: "DeepSpeed Inference: Multi-GPU inference with customized inference kernels and quantization support"
|
||||||
excerpt: ""
|
excerpt: ""
|
||||||
categories: news
|
|
||||||
new_post: false
|
|
||||||
date: 2021-03-16 00:00:00
|
date: 2021-03-16 00:00:00
|
||||||
|
tags: inference
|
||||||
---
|
---
|
||||||
While DeepSpeed supports training advanced large-scale models, using these trained models in the desired application scenarios is still challenging due to three major limitations in existing inference solutions: 1) lack of support for multi-GPU inference to fit large models and meet latency requirements, 2) limited GPU kernel performance when running inference with small batch sizes, and 3) difficulties in exploiting quantization, which includes both quantizing the model to reduce the model size and latency as well as supporting high-performance inference of quantized models without specialized hardware.
|
While DeepSpeed supports training advanced large-scale models, using these trained models in the desired application scenarios is still challenging due to three major limitations in existing inference solutions: 1) lack of support for multi-GPU inference to fit large models and meet latency requirements, 2) limited GPU kernel performance when running inference with small batch sizes, and 3) difficulties in exploiting quantization, which includes both quantizing the model to reduce the model size and latency as well as supporting high-performance inference of quantized models without specialized hardware.
|
||||||
|
|
||||||
|
7
docs/_posts/2021-05-14-inference-release.md
Normal file
7
docs/_posts/2021-05-14-inference-release.md
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
---
|
||||||
|
title: "DeepSpeed: Accelerating large-scale model inference and training via system optimizations and compression"
|
||||||
|
date: 2021-05-14
|
||||||
|
link: https://www.microsoft.com/en-us/research/blog/deepspeed-accelerating-large-scale-model-inference-and-training-via-system-optimizations-and-compression/
|
||||||
|
excerpt: ""
|
||||||
|
tags: inference
|
||||||
|
---
|
@ -1,9 +1,7 @@
|
|||||||
---
|
---
|
||||||
layout: single
|
|
||||||
title: "DeepSpeed powers 8x larger MoE model training with high performance"
|
title: "DeepSpeed powers 8x larger MoE model training with high performance"
|
||||||
excerpt: ""
|
excerpt: ""
|
||||||
categories: news
|
|
||||||
link: https://www.microsoft.com/en-us/research/blog/deepspeed-powers-8x-larger-moe-model-training-with-high-performance/
|
link: https://www.microsoft.com/en-us/research/blog/deepspeed-powers-8x-larger-moe-model-training-with-high-performance/
|
||||||
new_post: true
|
|
||||||
date: 2021-08-18 00:00:00
|
date: 2021-08-18 00:00:00
|
||||||
|
tags: training
|
||||||
---
|
---
|
||||||
|
@ -1,10 +1,9 @@
|
|||||||
---
|
---
|
||||||
layout: single
|
|
||||||
title: "Autotuning: Automatically discover the optimal DeepSpeed configuration that delivers good training speed"
|
title: "Autotuning: Automatically discover the optimal DeepSpeed configuration that delivers good training speed"
|
||||||
excerpt: ""
|
excerpt: ""
|
||||||
categories: news
|
date: 2021-11-16 10:00:00
|
||||||
new_post: true
|
tags: training
|
||||||
date: 2021-11-16 00:00:00
|
toc: false
|
||||||
---
|
---
|
||||||
|
|
||||||
We introduce a new feature called Autotuning to automatically discover the optimal DeepSpeed configuration that delivers good training speed. One pain point in model training is to figure out good performance-relevant configurations such as micro-batch size to fully utilize the hardware and achieve a high throughput number. This configuration exploring process is commonly done manually but is important since model training is repeated many times and benefits from using a good configuration. Not only is the hand-tuning process time-consuming, but the outcome is hardware-dependent. This means that a good configuration on one hardware might not be the best on another different hardware. The user thus has to hand tune the configuration again. With DeepSpeed, there are more configuration parameters that could potentially affect the training speed, thus making it more tedious to manually tune the configuration.
|
We introduce a new feature called Autotuning to automatically discover the optimal DeepSpeed configuration that delivers good training speed. One pain point in model training is to figure out good performance-relevant configurations such as micro-batch size to fully utilize the hardware and achieve a high throughput number. This configuration exploring process is commonly done manually but is important since model training is repeated many times and benefits from using a good configuration. Not only is the hand-tuning process time-consuming, but the outcome is hardware-dependent. This means that a good configuration on one hardware might not be the best on another different hardware. The user thus has to hand tune the configuration again. With DeepSpeed, there are more configuration parameters that could potentially affect the training speed, thus making it more tedious to manually tune the configuration.
|
||||||
|
@ -1,16 +1,10 @@
|
|||||||
---
|
---
|
||||||
layout: single
|
|
||||||
title: "DeepSpeed-MoE for NLG: Reducing the training cost of language models by 5 times"
|
title: "DeepSpeed-MoE for NLG: Reducing the training cost of language models by 5 times"
|
||||||
excerpt: ""
|
excerpt: ""
|
||||||
categories: news
|
|
||||||
new_post: false
|
|
||||||
date: 2021-12-09 22:00:00
|
date: 2021-12-09 22:00:00
|
||||||
|
tags: training
|
||||||
---
|
---
|
||||||
|
|
||||||
Published on December 9, 2021
|
|
||||||
|
|
||||||
[By DeepSpeed Team](https://www.microsoft.com/en-us/research/project/deepspeed/people/)
|
|
||||||
|
|
||||||
Autoregressive transformer-based natural language generation (referred to as
|
Autoregressive transformer-based natural language generation (referred to as
|
||||||
NLG in the rest of the blog) models can offer convincing solutions to a broad
|
NLG in the rest of the blog) models can offer convincing solutions to a broad
|
||||||
range of language tasks from document summarization, headline generation,
|
range of language tasks from document summarization, headline generation,
|
||||||
@ -92,7 +86,7 @@ the validation loss of the MoE model, 350M+MoE-128, is on par with the
|
|||||||
validation loss of the 1.3B dense model with 4x larger base. This is also true
|
validation loss of the 1.3B dense model with 4x larger base. This is also true
|
||||||
for 1.3B+MoE-128 in comparison with 6.7B dense model with 5x larger base.
|
for 1.3B+MoE-128 in comparison with 6.7B dense model with 5x larger base.
|
||||||
Furthermore, the model quality is on par not only for the validation loss but
|
Furthermore, the model quality is on par not only for the validation loss but
|
||||||
also for a wide variety of 6 zero-shot evaluation tasks as shown in Table 1,
|
also for a wide variety of 6 ZeRO-shot evaluation tasks as shown in Table 1,
|
||||||
demonstrating that these models in fact have very similar model quality.
|
demonstrating that these models in fact have very similar model quality.
|
||||||
|
|
||||||
{: .align-center}
|
{: .align-center}
|
||||||
@ -109,7 +103,7 @@ Figure 1: Token-wise validation loss curves for dense and MoE NLG models with di
|
|||||||
| 350M+MoE-128 (13B) | 0.6270 | 0.7459 | 0.6046 | 0.3560 | 0.1658 | 0.0517 |
|
| 350M+MoE-128 (13B) | 0.6270 | 0.7459 | 0.6046 | 0.3560 | 0.1658 | 0.0517 |
|
||||||
| 1.3B+MoE-128 (52B) | 0.6984 | 0.7671 | 0.6492 | 0.3809 | 0.3129 | 0.0719 |
|
| 1.3B+MoE-128 (52B) | 0.6984 | 0.7671 | 0.6492 | 0.3809 | 0.3129 | 0.0719 |
|
||||||
|
|
||||||
Table 1: Zero-shot evaluation results (last six columns) for different dense and MoE NLG models. All zero-shot evaluation results use the accuracy metric.
|
Table 1: ZeRO-shot evaluation results (last six columns) for different dense and MoE NLG models. All ZeRO-shot evaluation results use the accuracy metric.
|
||||||
|
|
||||||
## Same quality with 5x less training cost
|
## Same quality with 5x less training cost
|
||||||
|
|
||||||
|
@ -1,9 +1,7 @@
|
|||||||
---
|
---
|
||||||
layout: single
|
|
||||||
title: "DeepSpeed: Advancing MoE inference and training to power next-generation AI scale"
|
title: "DeepSpeed: Advancing MoE inference and training to power next-generation AI scale"
|
||||||
excerpt: ""
|
excerpt: ""
|
||||||
categories: news
|
|
||||||
link: https://www.microsoft.com/en-us/research/blog/deepspeed-advancing-moe-inference-and-training-to-power-next-generation-ai-scale/
|
link: https://www.microsoft.com/en-us/research/blog/deepspeed-advancing-moe-inference-and-training-to-power-next-generation-ai-scale/
|
||||||
new_post: true
|
|
||||||
date: 2022-01-19 00:00:00
|
date: 2022-01-19 00:00:00
|
||||||
|
tags: inference
|
||||||
---
|
---
|
||||||
|
68
docs/_sass/button-group.scss
Normal file
68
docs/_sass/button-group.scss
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
.btn-group button {
|
||||||
|
padding: 5px 15px; /* Some padding */
|
||||||
|
cursor: pointer; /* Pointer/hand icon */
|
||||||
|
text-transform: capitalize;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Clear floats (clearfix hack) */
|
||||||
|
.btn-group:after {
|
||||||
|
content: "";
|
||||||
|
clear: both;
|
||||||
|
display: table;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button-71 {
|
||||||
|
background-color: #0092ca;
|
||||||
|
border: 0;
|
||||||
|
border-radius: 56px;
|
||||||
|
color: #fff;
|
||||||
|
cursor: pointer;
|
||||||
|
display: inline-block;
|
||||||
|
font-family: system-ui,-apple-system,system-ui,"Segoe UI",Roboto,Ubuntu,"Helvetica Neue",sans-serif;
|
||||||
|
font-size: 16px;
|
||||||
|
font-weight: 600;
|
||||||
|
outline: 0;
|
||||||
|
padding: 16px 16px;
|
||||||
|
position: relative;
|
||||||
|
text-align: center;
|
||||||
|
text-decoration: none;
|
||||||
|
transition: all .3s;
|
||||||
|
user-select: none;
|
||||||
|
-webkit-user-select: none;
|
||||||
|
touch-action: manipulation;
|
||||||
|
margin: 1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button-71:before {
|
||||||
|
background-color: initial;
|
||||||
|
background-image: linear-gradient(#fff 0, rgba(255, 255, 255, 0) 100%);
|
||||||
|
border-radius: 125px;
|
||||||
|
content: "";
|
||||||
|
height: 50%;
|
||||||
|
left: 4%;
|
||||||
|
opacity: .5;
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
transition: all .3s;
|
||||||
|
width: 92%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button-71:hover {
|
||||||
|
box-shadow: rgba(255, 255, 255, .2) 0 3px 15px inset, rgba(0, 0, 0, .1) 0 3px 5px, rgba(0, 0, 0, .1) 0 10px 13px;
|
||||||
|
transform: scale(1.05);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.button-71:focus {
|
||||||
|
border: 3px solid black;
|
||||||
|
box-shadow: rgba(131, 192, 253, 0.5) 0 0 0 3px;
|
||||||
|
transform: scale(1.05);
|
||||||
|
outline: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@media (min-width: 768px) {
|
||||||
|
.button-71 {
|
||||||
|
padding: 16px 48px;
|
||||||
|
}
|
||||||
|
}
|
65
docs/_sass/minimal-mistakes.scss
Normal file
65
docs/_sass/minimal-mistakes.scss
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
/*!
|
||||||
|
* Minimal Mistakes Jekyll Theme 4.20.2 by Michael Rose
|
||||||
|
* Copyright 2013-2020 Michael Rose - mademistakes.com | @mmistakes
|
||||||
|
* Licensed under MIT (https://github.com/mmistakes/minimal-mistakes/blob/master/LICENSE)
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Variables */
|
||||||
|
@import "minimal-mistakes/variables";
|
||||||
|
|
||||||
|
/* Mixins and functions */
|
||||||
|
@import "minimal-mistakes/vendor/breakpoint/breakpoint";
|
||||||
|
@include breakpoint-set("to ems", true);
|
||||||
|
@import "minimal-mistakes/vendor/magnific-popup/magnific-popup"; // Magnific Popup
|
||||||
|
@import "minimal-mistakes/vendor/susy/susy";
|
||||||
|
@import "minimal-mistakes/mixins";
|
||||||
|
|
||||||
|
/* Core CSS */
|
||||||
|
@import "minimal-mistakes/reset";
|
||||||
|
@import "minimal-mistakes/base";
|
||||||
|
@import "minimal-mistakes/forms";
|
||||||
|
@import "minimal-mistakes/tables";
|
||||||
|
@import "minimal-mistakes/animations";
|
||||||
|
|
||||||
|
/* Components */
|
||||||
|
@import "minimal-mistakes/buttons";
|
||||||
|
@import "minimal-mistakes/notices";
|
||||||
|
@import "minimal-mistakes/masthead";
|
||||||
|
@import "minimal-mistakes/navigation";
|
||||||
|
@import "minimal-mistakes/footer";
|
||||||
|
@import "minimal-mistakes/search";
|
||||||
|
@import "minimal-mistakes/syntax";
|
||||||
|
|
||||||
|
/* Utility classes */
|
||||||
|
@import "minimal-mistakes/utilities";
|
||||||
|
|
||||||
|
/* Layout specific */
|
||||||
|
@import "minimal-mistakes/page";
|
||||||
|
@import "minimal-mistakes/archive";
|
||||||
|
@import "minimal-mistakes/sidebar";
|
||||||
|
@import "minimal-mistakes/print";
|
||||||
|
|
||||||
|
|
||||||
|
.wide2 {
|
||||||
|
.page {
|
||||||
|
float: left;
|
||||||
|
width: 115%;
|
||||||
|
@include breakpoint($large) {
|
||||||
|
padding-left: 15%;
|
||||||
|
}
|
||||||
|
|
||||||
|
@include breakpoint($x-large) {
|
||||||
|
padding-left: 15%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.page__related {
|
||||||
|
@include breakpoint($large) {
|
||||||
|
padding-left: 15%;
|
||||||
|
}
|
||||||
|
|
||||||
|
@include breakpoint($x-large) {
|
||||||
|
padding-left: 15%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
463
docs/_sass/minimal-mistakes/_archive.scss
Normal file
463
docs/_sass/minimal-mistakes/_archive.scss
Normal file
@ -0,0 +1,463 @@
|
|||||||
|
/* ==========================================================================
|
||||||
|
ARCHIVE
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
.archive {
|
||||||
|
margin-top: 1em;
|
||||||
|
margin-bottom: 2em;
|
||||||
|
|
||||||
|
@include breakpoint($large) {
|
||||||
|
float: right;
|
||||||
|
width: calc(100% - #{$right-sidebar-width-narrow} - 10%);
|
||||||
|
padding-right: $right-sidebar-width-narrow;
|
||||||
|
}
|
||||||
|
|
||||||
|
@include breakpoint($x-large) {
|
||||||
|
width: calc(100% - #{$right-sidebar-width} - 10%);
|
||||||
|
padding-right: $right-sidebar-width;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.archive__item {
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
a {
|
||||||
|
position: relative;
|
||||||
|
z-index: 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
a[rel="permalink"] {
|
||||||
|
position: static;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.archive__subtitle {
|
||||||
|
margin: 1.414em 0 0.5em;
|
||||||
|
padding-bottom: 0.5em;
|
||||||
|
font-size: $type-size-5;
|
||||||
|
color: $muted-text-color;
|
||||||
|
border-bottom: 1px solid $border-color;
|
||||||
|
|
||||||
|
+ .list__item .archive__item-title {
|
||||||
|
margin-top: 0.5em;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.archive__item-title {
|
||||||
|
margin-bottom: 0.25em;
|
||||||
|
font-family: $sans-serif-narrow;
|
||||||
|
line-height: initial;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
|
||||||
|
a[rel="permalink"]::before {
|
||||||
|
content: '';
|
||||||
|
position: absolute;
|
||||||
|
left: 0;
|
||||||
|
top: 0;
|
||||||
|
right: 0;
|
||||||
|
bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
a + a {
|
||||||
|
opacity: 0.5;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* remove border*/
|
||||||
|
.page__content {
|
||||||
|
.archive__item-title {
|
||||||
|
margin-top: 1em;
|
||||||
|
border-bottom: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.archive__item-excerpt {
|
||||||
|
margin-top: 0;
|
||||||
|
font-size: $type-size-6;
|
||||||
|
|
||||||
|
& + p {
|
||||||
|
text-indent: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.archive__item-teaser {
|
||||||
|
position: relative;
|
||||||
|
border-radius: $border-radius;
|
||||||
|
overflow: hidden;
|
||||||
|
|
||||||
|
img {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.archive__item-caption {
|
||||||
|
position: absolute;
|
||||||
|
bottom: 0;
|
||||||
|
right: 0;
|
||||||
|
margin: 0 auto;
|
||||||
|
padding: 2px 5px;
|
||||||
|
color: #fff;
|
||||||
|
font-family: $caption-font-family;
|
||||||
|
font-size: $type-size-8;
|
||||||
|
background: #000;
|
||||||
|
text-align: right;
|
||||||
|
z-index: 5;
|
||||||
|
opacity: 0.5;
|
||||||
|
border-radius: $border-radius 0 0 0;
|
||||||
|
|
||||||
|
@include breakpoint($large) {
|
||||||
|
padding: 5px 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
color: #fff;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
List view
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
.list__item {
|
||||||
|
.page__meta {
|
||||||
|
margin: 0 0 4px;
|
||||||
|
font-size: 0.6em;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Grid view
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
.archive {
|
||||||
|
.grid__wrapper {
|
||||||
|
/* extend grid elements to the right */
|
||||||
|
|
||||||
|
@include breakpoint($large) {
|
||||||
|
margin-right: -1 * $right-sidebar-width-narrow;
|
||||||
|
}
|
||||||
|
|
||||||
|
@include breakpoint($x-large) {
|
||||||
|
margin-right: -1 * $right-sidebar-width;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.grid__item {
|
||||||
|
margin-bottom: 2em;
|
||||||
|
|
||||||
|
@include breakpoint($small) {
|
||||||
|
float: left;
|
||||||
|
width: span(5 of 10);
|
||||||
|
|
||||||
|
&:nth-child(2n + 1) {
|
||||||
|
clear: both;
|
||||||
|
margin-left: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:nth-child(2n + 2) {
|
||||||
|
clear: none;
|
||||||
|
margin-left: gutter(of 10);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@include breakpoint($medium) {
|
||||||
|
margin-left: 0; /* override margin*/
|
||||||
|
margin-right: 0; /* override margin*/
|
||||||
|
width: span(3 of 12);
|
||||||
|
|
||||||
|
&:nth-child(2n + 1) {
|
||||||
|
clear: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:nth-child(4n + 1) {
|
||||||
|
clear: both;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:nth-child(4n + 2) {
|
||||||
|
clear: none;
|
||||||
|
margin-left: gutter(1 of 12);
|
||||||
|
}
|
||||||
|
|
||||||
|
&:nth-child(4n + 3) {
|
||||||
|
clear: none;
|
||||||
|
margin-left: gutter(1 of 12);
|
||||||
|
}
|
||||||
|
|
||||||
|
&:nth-child(4n + 4) {
|
||||||
|
clear: none;
|
||||||
|
margin-left: gutter(1 of 12);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.page__meta {
|
||||||
|
margin: 0 0 4px;
|
||||||
|
font-size: 0.6em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.page__meta-sep {
|
||||||
|
display: block;
|
||||||
|
|
||||||
|
&::before {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.archive__item-title {
|
||||||
|
margin-top: 0.5em;
|
||||||
|
font-size: $type-size-5;
|
||||||
|
}
|
||||||
|
|
||||||
|
.archive__item-excerpt {
|
||||||
|
display: none;
|
||||||
|
|
||||||
|
@include breakpoint($medium) {
|
||||||
|
display: block;
|
||||||
|
font-size: $type-size-6;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.archive__item-teaser {
|
||||||
|
@include breakpoint($small) {
|
||||||
|
max-height: 200px;
|
||||||
|
}
|
||||||
|
|
||||||
|
@include breakpoint($medium) {
|
||||||
|
max-height: 120px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Features
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
.feature__wrapper {
|
||||||
|
@include clearfix();
|
||||||
|
margin-bottom: 2em;
|
||||||
|
border-bottom: 1px solid $border-color;
|
||||||
|
|
||||||
|
.archive__item-title {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.feature__item {
|
||||||
|
position: relative;
|
||||||
|
margin-bottom: 2em;
|
||||||
|
font-size: 1.125em;
|
||||||
|
|
||||||
|
@include breakpoint($small) {
|
||||||
|
float: left;
|
||||||
|
margin-bottom: 0;
|
||||||
|
width: span(4 of 12);
|
||||||
|
|
||||||
|
&:nth-child(3n + 1) {
|
||||||
|
clear: both;
|
||||||
|
margin-left: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:nth-child(3n + 2) {
|
||||||
|
clear: none;
|
||||||
|
margin-left: gutter(of 12);
|
||||||
|
}
|
||||||
|
|
||||||
|
&:nth-child(3n + 3) {
|
||||||
|
clear: none;
|
||||||
|
margin-left: gutter(of 12);
|
||||||
|
}
|
||||||
|
|
||||||
|
.feature__item-teaser {
|
||||||
|
max-height: 200px;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.archive__item-body {
|
||||||
|
padding-left: gutter(1 of 12);
|
||||||
|
padding-right: gutter(1 of 12);
|
||||||
|
}
|
||||||
|
|
||||||
|
a.btn::before {
|
||||||
|
content: '';
|
||||||
|
position: absolute;
|
||||||
|
left: 0;
|
||||||
|
top: 0;
|
||||||
|
right: 0;
|
||||||
|
bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
&--left {
|
||||||
|
position: relative;
|
||||||
|
float: left;
|
||||||
|
margin-left: 0;
|
||||||
|
margin-right: 0;
|
||||||
|
width: 100%;
|
||||||
|
clear: both;
|
||||||
|
font-size: 1.125em;
|
||||||
|
|
||||||
|
.archive__item {
|
||||||
|
float: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.archive__item-teaser {
|
||||||
|
margin-bottom: 2em;
|
||||||
|
}
|
||||||
|
|
||||||
|
a.btn::before {
|
||||||
|
content: '';
|
||||||
|
position: absolute;
|
||||||
|
left: 0;
|
||||||
|
top: 0;
|
||||||
|
right: 0;
|
||||||
|
bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@include breakpoint($small) {
|
||||||
|
.archive__item-teaser {
|
||||||
|
float: left;
|
||||||
|
width: span(5 of 12);
|
||||||
|
}
|
||||||
|
|
||||||
|
.archive__item-body {
|
||||||
|
float: right;
|
||||||
|
padding-left: gutter(0.5 of 12);
|
||||||
|
padding-right: gutter(1 of 12);
|
||||||
|
width: span(7 of 12);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&--right {
|
||||||
|
position: relative;
|
||||||
|
float: left;
|
||||||
|
margin-left: 0;
|
||||||
|
margin-right: 0;
|
||||||
|
width: 100%;
|
||||||
|
clear: both;
|
||||||
|
font-size: 1.125em;
|
||||||
|
|
||||||
|
.archive__item {
|
||||||
|
float: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.archive__item-teaser {
|
||||||
|
margin-bottom: 2em;
|
||||||
|
}
|
||||||
|
|
||||||
|
a.btn::before {
|
||||||
|
content: '';
|
||||||
|
position: absolute;
|
||||||
|
left: 0;
|
||||||
|
top: 0;
|
||||||
|
right: 0;
|
||||||
|
bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@include breakpoint($small) {
|
||||||
|
text-align: right;
|
||||||
|
|
||||||
|
.archive__item-teaser {
|
||||||
|
float: right;
|
||||||
|
width: span(5 of 12);
|
||||||
|
}
|
||||||
|
|
||||||
|
.archive__item-body {
|
||||||
|
float: left;
|
||||||
|
width: span(7 of 12);
|
||||||
|
padding-left: gutter(0.5 of 12);
|
||||||
|
padding-right: gutter(1 of 12);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&--center {
|
||||||
|
position: relative;
|
||||||
|
float: left;
|
||||||
|
margin-left: 0;
|
||||||
|
margin-right: 0;
|
||||||
|
width: 100%;
|
||||||
|
clear: both;
|
||||||
|
font-size: 1.125em;
|
||||||
|
|
||||||
|
.archive__item {
|
||||||
|
float: left;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.archive__item-teaser {
|
||||||
|
margin-bottom: 2em;
|
||||||
|
}
|
||||||
|
|
||||||
|
a.btn::before {
|
||||||
|
content: '';
|
||||||
|
position: absolute;
|
||||||
|
left: 0;
|
||||||
|
top: 0;
|
||||||
|
right: 0;
|
||||||
|
bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@include breakpoint($small) {
|
||||||
|
text-align: center;
|
||||||
|
|
||||||
|
.archive__item-teaser {
|
||||||
|
margin: 0 auto;
|
||||||
|
width: span(5 of 12);
|
||||||
|
}
|
||||||
|
|
||||||
|
.archive__item-body {
|
||||||
|
margin: 0 auto;
|
||||||
|
width: span(7 of 12);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Place inside an archive layout */
|
||||||
|
|
||||||
|
.archive {
|
||||||
|
.feature__wrapper {
|
||||||
|
.archive__item-title {
|
||||||
|
margin-top: 0.25em;
|
||||||
|
font-size: 1em;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.feature__item,
|
||||||
|
.feature__item--left,
|
||||||
|
.feature__item--center,
|
||||||
|
.feature__item--right {
|
||||||
|
font-size: 1em;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Wide Pages
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
.wide {
|
||||||
|
.archive {
|
||||||
|
@include breakpoint($large) {
|
||||||
|
padding-right: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@include breakpoint($x-large) {
|
||||||
|
padding-right: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Place inside a single layout */
|
||||||
|
|
||||||
|
.layout--single {
|
||||||
|
.feature__wrapper {
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
}
|
573
docs/_sass/minimal-mistakes/_navigation.scss
Normal file
573
docs/_sass/minimal-mistakes/_navigation.scss
Normal file
@ -0,0 +1,573 @@
|
|||||||
|
/* ==========================================================================
|
||||||
|
NAVIGATION
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
/*
|
||||||
|
Breadcrumb navigation links
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
.breadcrumbs {
|
||||||
|
@include clearfix;
|
||||||
|
margin: 0 auto;
|
||||||
|
max-width: 100%;
|
||||||
|
padding-left: 1em;
|
||||||
|
padding-right: 1em;
|
||||||
|
font-family: $sans-serif;
|
||||||
|
-webkit-animation: $intro-transition;
|
||||||
|
animation: $intro-transition;
|
||||||
|
-webkit-animation-delay: 0.3s;
|
||||||
|
animation-delay: 0.3s;
|
||||||
|
|
||||||
|
@include breakpoint($x-large) {
|
||||||
|
max-width: $x-large;
|
||||||
|
}
|
||||||
|
|
||||||
|
ol {
|
||||||
|
padding: 0;
|
||||||
|
list-style: none;
|
||||||
|
font-size: $type-size-6;
|
||||||
|
|
||||||
|
@include breakpoint($large) {
|
||||||
|
float: right;
|
||||||
|
width: calc(100% - #{$right-sidebar-width-narrow});
|
||||||
|
}
|
||||||
|
|
||||||
|
@include breakpoint($x-large) {
|
||||||
|
width: calc(100% - #{$right-sidebar-width});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
li {
|
||||||
|
display: inline;
|
||||||
|
}
|
||||||
|
|
||||||
|
.current {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Post pagination navigation links
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
.pagination {
|
||||||
|
@include clearfix();
|
||||||
|
float: left;
|
||||||
|
margin-top: 1em;
|
||||||
|
padding-top: 1em;
|
||||||
|
width: 100%;
|
||||||
|
|
||||||
|
ul {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
list-style-type: none;
|
||||||
|
font-family: $sans-serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
li {
|
||||||
|
display: block;
|
||||||
|
float: left;
|
||||||
|
margin-left: -1px;
|
||||||
|
|
||||||
|
a {
|
||||||
|
display: block;
|
||||||
|
margin-bottom: 0.25em;
|
||||||
|
padding: 0.5em 1em;
|
||||||
|
font-family: $sans-serif;
|
||||||
|
font-size: 14px;
|
||||||
|
font-weight: bold;
|
||||||
|
line-height: 1.5;
|
||||||
|
text-align: center;
|
||||||
|
text-decoration: none;
|
||||||
|
color: $muted-text-color;
|
||||||
|
border: 1px solid mix(#000, $border-color, 25%);
|
||||||
|
border-radius: 0;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
color: $link-color-hover;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.current,
|
||||||
|
&.current.disabled {
|
||||||
|
color: #fff;
|
||||||
|
background: $primary-color;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.disabled {
|
||||||
|
color: rgba($muted-text-color, 0.5);
|
||||||
|
pointer-events: none;
|
||||||
|
cursor: not-allowed;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&:first-child {
|
||||||
|
margin-left: 0;
|
||||||
|
|
||||||
|
a {
|
||||||
|
border-top-left-radius: $border-radius;
|
||||||
|
border-bottom-left-radius: $border-radius;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&:last-child {
|
||||||
|
a {
|
||||||
|
border-top-right-radius: $border-radius;
|
||||||
|
border-bottom-right-radius: $border-radius;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* next/previous buttons */
|
||||||
|
&--pager {
|
||||||
|
display: block;
|
||||||
|
padding: 1em 2em;
|
||||||
|
float: left;
|
||||||
|
width: 50%;
|
||||||
|
font-family: $sans-serif;
|
||||||
|
font-size: $type-size-5;
|
||||||
|
font-weight: bold;
|
||||||
|
text-align: center;
|
||||||
|
text-decoration: none;
|
||||||
|
color: $muted-text-color;
|
||||||
|
border: 1px solid mix(#000, $border-color, 25%);
|
||||||
|
border-radius: $border-radius;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
@include yiq-contrasted($muted-text-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
&:first-child {
|
||||||
|
border-top-right-radius: 0;
|
||||||
|
border-bottom-right-radius: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:last-child {
|
||||||
|
margin-left: -1px;
|
||||||
|
border-top-left-radius: 0;
|
||||||
|
border-bottom-left-radius: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.disabled {
|
||||||
|
color: rgba($muted-text-color, 0.5);
|
||||||
|
pointer-events: none;
|
||||||
|
cursor: not-allowed;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.page__content + .pagination,
|
||||||
|
.page__meta + .pagination,
|
||||||
|
.page__share + .pagination,
|
||||||
|
.page__comments + .pagination {
|
||||||
|
margin-top: 2em;
|
||||||
|
padding-top: 2em;
|
||||||
|
border-top: 1px solid $border-color;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Priority plus navigation
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
.greedy-nav {
|
||||||
|
position: relative;
|
||||||
|
display: -webkit-box;
|
||||||
|
display: -ms-flexbox;
|
||||||
|
display: flex;
|
||||||
|
-webkit-box-align: center;
|
||||||
|
-ms-flex-align: center;
|
||||||
|
align-items: center;
|
||||||
|
min-height: $nav-height;
|
||||||
|
background: $background-color;
|
||||||
|
|
||||||
|
a {
|
||||||
|
display: block;
|
||||||
|
margin: 0 1rem;
|
||||||
|
color: $masthead-link-color;
|
||||||
|
text-decoration: none;
|
||||||
|
-webkit-transition: none;
|
||||||
|
transition: none;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
color: $masthead-link-color-hover;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.site-logo {
|
||||||
|
margin-left: 0;
|
||||||
|
margin-right: 0.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.site-title {
|
||||||
|
margin-left: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
img{
|
||||||
|
-webkit-transition: none;
|
||||||
|
transition: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
&__toggle {
|
||||||
|
-ms-flex-item-align: center;
|
||||||
|
align-self: center;
|
||||||
|
height: $nav-toggle-height;
|
||||||
|
border: 0;
|
||||||
|
outline: none;
|
||||||
|
background-color: transparent;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
.visible-links {
|
||||||
|
display: -webkit-box;
|
||||||
|
display: -ms-flexbox;
|
||||||
|
display: flex;
|
||||||
|
-webkit-box-pack: end;
|
||||||
|
-ms-flex-pack: end;
|
||||||
|
justify-content: flex-end;
|
||||||
|
-webkit-box-flex: 1;
|
||||||
|
-ms-flex: 1;
|
||||||
|
flex: 1;
|
||||||
|
overflow: hidden;
|
||||||
|
|
||||||
|
li {
|
||||||
|
-webkit-box-flex: 0;
|
||||||
|
-ms-flex: none;
|
||||||
|
flex: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
&:before {
|
||||||
|
content: "";
|
||||||
|
position: absolute;
|
||||||
|
left: 0;
|
||||||
|
bottom: 0;
|
||||||
|
height: 4px;
|
||||||
|
background: $primary-color;
|
||||||
|
width: 100%;
|
||||||
|
-webkit-transition: $global-transition;
|
||||||
|
transition: $global-transition;
|
||||||
|
-webkit-transform: scaleX(0) translate3d(0, 0, 0);
|
||||||
|
transform: scaleX(0) translate3d(0, 0, 0); // hide
|
||||||
|
}
|
||||||
|
|
||||||
|
&:hover:before {
|
||||||
|
-webkit-transform: scaleX(1);
|
||||||
|
-ms-transform: scaleX(1);
|
||||||
|
transform: scaleX(1); // reveal
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.hidden-links {
|
||||||
|
position: absolute;
|
||||||
|
top: 100%;
|
||||||
|
right: 0;
|
||||||
|
margin-top: 15px;
|
||||||
|
padding: 5px;
|
||||||
|
border: 1px solid $border-color;
|
||||||
|
border-radius: $border-radius;
|
||||||
|
background: $background-color;
|
||||||
|
-webkit-box-shadow: 0 2px 4px 0 rgba(#000, 0.16),
|
||||||
|
0 2px 10px 0 rgba(#000, 0.12);
|
||||||
|
box-shadow: 0 2px 4px 0 rgba(#000, 0.16), 0 2px 10px 0 rgba(#000, 0.12);
|
||||||
|
|
||||||
|
&.hidden {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
margin: 0;
|
||||||
|
padding: 10px 20px;
|
||||||
|
font-size: $type-size-5;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
color: $masthead-link-color-hover;
|
||||||
|
background: $navicon-link-color-hover;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&:before {
|
||||||
|
content: "";
|
||||||
|
position: absolute;
|
||||||
|
top: -11px;
|
||||||
|
right: 10px;
|
||||||
|
width: 0;
|
||||||
|
border-style: solid;
|
||||||
|
border-width: 0 10px 10px;
|
||||||
|
border-color: $border-color transparent;
|
||||||
|
display: block;
|
||||||
|
z-index: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:after {
|
||||||
|
content: "";
|
||||||
|
position: absolute;
|
||||||
|
top: -10px;
|
||||||
|
right: 10px;
|
||||||
|
width: 0;
|
||||||
|
border-style: solid;
|
||||||
|
border-width: 0 10px 10px;
|
||||||
|
border-color: $background-color transparent;
|
||||||
|
display: block;
|
||||||
|
z-index: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
li {
|
||||||
|
display: block;
|
||||||
|
border-bottom: 1px solid $border-color;
|
||||||
|
|
||||||
|
&:last-child {
|
||||||
|
border-bottom: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.no-js {
|
||||||
|
.greedy-nav {
|
||||||
|
.visible-links {
|
||||||
|
-ms-flex-wrap: wrap;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
overflow: visible;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Navigation list
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
.nav__list {
|
||||||
|
margin-bottom: 1.5em;
|
||||||
|
|
||||||
|
input[type="checkbox"],
|
||||||
|
label {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
@include breakpoint(max-width $large - 1px) {
|
||||||
|
label {
|
||||||
|
position: relative;
|
||||||
|
display: inline-block;
|
||||||
|
padding: 0.5em 2.5em 0.5em 1em;
|
||||||
|
color: $gray;
|
||||||
|
font-size: $type-size-6;
|
||||||
|
font-weight: bold;
|
||||||
|
border: 1px solid $light-gray;
|
||||||
|
border-radius: $border-radius;
|
||||||
|
z-index: 20;
|
||||||
|
-webkit-transition: 0.2s ease-out;
|
||||||
|
transition: 0.2s ease-out;
|
||||||
|
cursor: pointer;
|
||||||
|
|
||||||
|
&:before,
|
||||||
|
&:after {
|
||||||
|
content: "";
|
||||||
|
position: absolute;
|
||||||
|
right: 1em;
|
||||||
|
top: 1.25em;
|
||||||
|
width: 0.75em;
|
||||||
|
height: 0.125em;
|
||||||
|
line-height: 1;
|
||||||
|
background-color: $gray;
|
||||||
|
-webkit-transition: 0.2s ease-out;
|
||||||
|
transition: 0.2s ease-out;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:after {
|
||||||
|
-webkit-transform: rotate(90deg);
|
||||||
|
-ms-transform: rotate(90deg);
|
||||||
|
transform: rotate(90deg);
|
||||||
|
}
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
color: #fff;
|
||||||
|
border-color: $gray;
|
||||||
|
background-color: mix(white, #000, 20%);
|
||||||
|
|
||||||
|
&:before,
|
||||||
|
&:after {
|
||||||
|
background-color: #fff;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* selected*/
|
||||||
|
input:checked + label {
|
||||||
|
color: white;
|
||||||
|
background-color: mix(white, #000, 20%);
|
||||||
|
|
||||||
|
&:before,
|
||||||
|
&:after {
|
||||||
|
background-color: #fff;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* on hover show expand*/
|
||||||
|
label:hover:after {
|
||||||
|
-webkit-transform: rotate(90deg);
|
||||||
|
-ms-transform: rotate(90deg);
|
||||||
|
transform: rotate(90deg);
|
||||||
|
}
|
||||||
|
|
||||||
|
input:checked + label:hover:after {
|
||||||
|
-webkit-transform: rotate(0);
|
||||||
|
-ms-transform: rotate(0);
|
||||||
|
transform: rotate(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
ul {
|
||||||
|
margin-bottom: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
display: block;
|
||||||
|
padding: 0.25em 0;
|
||||||
|
|
||||||
|
@include breakpoint($large) {
|
||||||
|
padding-top: 0.125em;
|
||||||
|
padding-bottom: 0.125em;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav__list .nav__items {
|
||||||
|
margin: 0;
|
||||||
|
font-size: 1.25rem;
|
||||||
|
|
||||||
|
a {
|
||||||
|
color: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
.active {
|
||||||
|
margin-left: -0.5em;
|
||||||
|
padding-left: 0.5em;
|
||||||
|
padding-right: 0.5em;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
@include breakpoint(max-width $large - 1px) {
|
||||||
|
position: relative;
|
||||||
|
max-height: 0;
|
||||||
|
opacity: 0%;
|
||||||
|
overflow: hidden;
|
||||||
|
z-index: 10;
|
||||||
|
-webkit-transition: 0.3s ease-in-out;
|
||||||
|
transition: 0.3s ease-in-out;
|
||||||
|
-webkit-transform: translate(0, 10%);
|
||||||
|
-ms-transform: translate(0, 10%);
|
||||||
|
transform: translate(0, 10%);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@include breakpoint(max-width $large - 1px) {
|
||||||
|
.nav__list input:checked ~ .nav__items {
|
||||||
|
-webkit-transition: 0.5s ease-in-out;
|
||||||
|
transition: 0.5s ease-in-out;
|
||||||
|
max-height: 9999px; /* exaggerate max-height to accommodate tall lists*/
|
||||||
|
overflow: visible;
|
||||||
|
opacity: 1;
|
||||||
|
margin-top: 1em;
|
||||||
|
-webkit-transform: translate(0, 0);
|
||||||
|
-ms-transform: translate(0, 0);
|
||||||
|
transform: translate(0, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav__title {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0.5rem 0.75rem;
|
||||||
|
font-family: $sans-serif-narrow;
|
||||||
|
font-size: $type-size-5;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav__sub-title {
|
||||||
|
display: block;
|
||||||
|
margin: 0.5rem 0;
|
||||||
|
padding: 0.25rem 0;
|
||||||
|
font-family: $sans-serif-narrow;
|
||||||
|
font-size: $type-size-6;
|
||||||
|
font-weight: bold;
|
||||||
|
text-transform: uppercase;
|
||||||
|
border-bottom: 1px solid $border-color;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Table of contents navigation
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
.toc {
|
||||||
|
font-family: $sans-serif-narrow;
|
||||||
|
color: $gray;
|
||||||
|
background-color: $background-color;
|
||||||
|
border: 1px solid $border-color;
|
||||||
|
border-radius: $border-radius;
|
||||||
|
-webkit-box-shadow: $box-shadow;
|
||||||
|
box-shadow: $box-shadow;
|
||||||
|
|
||||||
|
.nav__title {
|
||||||
|
color: #fff;
|
||||||
|
font-size: $type-size-6;
|
||||||
|
background: $primary-color;
|
||||||
|
border-top-left-radius: $border-radius;
|
||||||
|
border-top-right-radius: $border-radius;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Scrollspy marks toc items as .active when they are in focus
|
||||||
|
.active a {
|
||||||
|
@include yiq-contrasted($active-color);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.toc__menu {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
width: 100%;
|
||||||
|
list-style: none;
|
||||||
|
font-size: $type-size-6;
|
||||||
|
|
||||||
|
@include breakpoint($large) {
|
||||||
|
font-size: $type-size-7;
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
display: block;
|
||||||
|
padding: 0.25rem 0.75rem;
|
||||||
|
color: $muted-text-color;
|
||||||
|
font-weight: bold;
|
||||||
|
line-height: 1.5;
|
||||||
|
border-bottom: 1px solid $border-color;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
color: $text-color;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
li ul > li a {
|
||||||
|
padding-left: 1.25rem;
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
li ul li ul > li a {
|
||||||
|
padding-left: 1.75rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
li ul li ul li ul > li a {
|
||||||
|
padding-left: 2.25rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
li ul li ul li ul li ul > li a {
|
||||||
|
padding-left: 2.75rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
li ul li ul li ul li ul li ul > li a {
|
||||||
|
padding-left: 3.25rem
|
||||||
|
}
|
||||||
|
}
|
563
docs/_sass/minimal-mistakes/_page.scss
Normal file
563
docs/_sass/minimal-mistakes/_page.scss
Normal file
@ -0,0 +1,563 @@
|
|||||||
|
/* ==========================================================================
|
||||||
|
SINGLE PAGE/POST
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
#main {
|
||||||
|
@include clearfix;
|
||||||
|
margin-left: auto;
|
||||||
|
margin-right: auto;
|
||||||
|
padding-left: 1em;
|
||||||
|
padding-right: 1em;
|
||||||
|
-webkit-animation: $intro-transition;
|
||||||
|
animation: $intro-transition;
|
||||||
|
max-width: 100%;
|
||||||
|
-webkit-animation-delay: 0.15s;
|
||||||
|
animation-delay: 0.15s;
|
||||||
|
|
||||||
|
@include breakpoint($x-large) {
|
||||||
|
max-width: $max-width;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
display: -webkit-box;
|
||||||
|
display: -ms-flexbox;
|
||||||
|
display: flex;
|
||||||
|
min-height: 100vh;
|
||||||
|
-webkit-box-orient: vertical;
|
||||||
|
-webkit-box-direction: normal;
|
||||||
|
-ms-flex-direction: column;
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
|
||||||
|
.initial-content,
|
||||||
|
.search-content {
|
||||||
|
flex: 1 0 auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.page {
|
||||||
|
@include breakpoint($large) {
|
||||||
|
float: right;
|
||||||
|
width: calc(100% - #{$right-sidebar-width-narrow});
|
||||||
|
padding-right: $right-sidebar-width-narrow;
|
||||||
|
}
|
||||||
|
|
||||||
|
@include breakpoint($x-large) {
|
||||||
|
width: calc(100% - #{$right-sidebar-width});
|
||||||
|
padding-right: $right-sidebar-width;
|
||||||
|
}
|
||||||
|
|
||||||
|
.page__inner-wrap {
|
||||||
|
float: left;
|
||||||
|
margin-top: 1em;
|
||||||
|
margin-left: 10%;
|
||||||
|
margin-right: 0%;
|
||||||
|
width: 80%;
|
||||||
|
clear: both;
|
||||||
|
|
||||||
|
.page__content {
|
||||||
|
float: center;
|
||||||
|
max-width: 1280px;
|
||||||
|
}
|
||||||
|
.page__meta,
|
||||||
|
.page__share {
|
||||||
|
position: relative;
|
||||||
|
float: left;
|
||||||
|
margin-left: 0;
|
||||||
|
margin-right: 10%;
|
||||||
|
width: 100%;
|
||||||
|
clear: both;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.page__title {
|
||||||
|
margin-top: 0;
|
||||||
|
line-height: 1.5;
|
||||||
|
|
||||||
|
& + .page__meta {
|
||||||
|
margin-top: -0.5em;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.page__lead {
|
||||||
|
font-family: $global-font-family;
|
||||||
|
font-size: $type-size-4;
|
||||||
|
}
|
||||||
|
|
||||||
|
.page__content {
|
||||||
|
h2 {
|
||||||
|
padding-bottom: 0.5em;
|
||||||
|
border-bottom: 1px solid $border-color;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1, h2, h3, h4, h5, h6 {
|
||||||
|
.header-link {
|
||||||
|
position: relative;
|
||||||
|
left: 0.5em;
|
||||||
|
opacity: 0;
|
||||||
|
font-size: 0.8em;
|
||||||
|
-webkit-transition: opacity 0.2s ease-in-out 0.1s;
|
||||||
|
-moz-transition: opacity 0.2s ease-in-out 0.1s;
|
||||||
|
-o-transition: opacity 0.2s ease-in-out 0.1s;
|
||||||
|
transition: opacity 0.2s ease-in-out 0.1s;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:hover .header-link {
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
p,
|
||||||
|
li,
|
||||||
|
dl {
|
||||||
|
font-size: 1em;
|
||||||
|
line-height: 1.7777778;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* paragraph indents */
|
||||||
|
p {
|
||||||
|
margin: 0 0 $indent-var;
|
||||||
|
|
||||||
|
/* sibling indentation*/
|
||||||
|
@if $paragraph-indent == true {
|
||||||
|
& + p {
|
||||||
|
text-indent: $indent-var;
|
||||||
|
margin-top: -($indent-var);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
a:not(.btn) {
|
||||||
|
&:hover {
|
||||||
|
text-decoration: underline;
|
||||||
|
|
||||||
|
img {
|
||||||
|
box-shadow: 0 0 10px rgba(#000, 0.25);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dt {
|
||||||
|
margin-top: 1em;
|
||||||
|
font-family: $sans-serif;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
dd {
|
||||||
|
margin-left: 1em;
|
||||||
|
font-family: $sans-serif;
|
||||||
|
font-size: $type-size-6;
|
||||||
|
}
|
||||||
|
|
||||||
|
.small {
|
||||||
|
font-size: $type-size-6;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* blockquote citations */
|
||||||
|
blockquote + .small {
|
||||||
|
margin-top: -1.5em;
|
||||||
|
padding-left: 1.25rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.page__hero {
|
||||||
|
position: relative;
|
||||||
|
margin-bottom: 2em;
|
||||||
|
@include clearfix;
|
||||||
|
-webkit-animation: $intro-transition;
|
||||||
|
animation: $intro-transition;
|
||||||
|
-webkit-animation-delay: 0.25s;
|
||||||
|
animation-delay: 0.25s;
|
||||||
|
|
||||||
|
&--overlay {
|
||||||
|
position: relative;
|
||||||
|
margin-bottom: 2em;
|
||||||
|
padding: 3em 0;
|
||||||
|
@include clearfix;
|
||||||
|
background-size: cover;
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
background-position: center;
|
||||||
|
-webkit-animation: $intro-transition;
|
||||||
|
animation: $intro-transition;
|
||||||
|
-webkit-animation-delay: 0.25s;
|
||||||
|
animation-delay: 0.25s;
|
||||||
|
|
||||||
|
a {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wrapper {
|
||||||
|
padding-left: 1em;
|
||||||
|
padding-right: 1em;
|
||||||
|
|
||||||
|
@include breakpoint($x-large) {
|
||||||
|
max-width: $x-large;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.page__title,
|
||||||
|
.page__meta,
|
||||||
|
.page__lead,
|
||||||
|
.btn {
|
||||||
|
color: #fff;
|
||||||
|
text-shadow: 1px 1px 4px rgba(#000, 0.5);
|
||||||
|
}
|
||||||
|
|
||||||
|
.page__lead {
|
||||||
|
max-width: $medium;
|
||||||
|
}
|
||||||
|
|
||||||
|
.page__title {
|
||||||
|
font-size: $type-size-2;
|
||||||
|
|
||||||
|
@include breakpoint($small) {
|
||||||
|
font-size: $type-size-1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.page__hero-image {
|
||||||
|
width: 100%;
|
||||||
|
height: auto;
|
||||||
|
-ms-interpolation-mode: bicubic;
|
||||||
|
}
|
||||||
|
|
||||||
|
.page__hero-caption {
|
||||||
|
position: absolute;
|
||||||
|
bottom: 0;
|
||||||
|
right: 0;
|
||||||
|
margin: 0 auto;
|
||||||
|
padding: 2px 5px;
|
||||||
|
color: #fff;
|
||||||
|
font-family: $caption-font-family;
|
||||||
|
font-size: $type-size-7;
|
||||||
|
background: #000;
|
||||||
|
text-align: right;
|
||||||
|
z-index: 5;
|
||||||
|
opacity: 0.5;
|
||||||
|
border-radius: $border-radius 0 0 0;
|
||||||
|
|
||||||
|
@include breakpoint($large) {
|
||||||
|
padding: 5px 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
color: #fff;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Social sharing
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
.page__share {
|
||||||
|
margin-top: 2em;
|
||||||
|
padding-top: 1em;
|
||||||
|
border-top: 1px solid $border-color;
|
||||||
|
|
||||||
|
@include breakpoint(max-width $small) {
|
||||||
|
.btn span {
|
||||||
|
border: 0;
|
||||||
|
clip: rect(0 0 0 0);
|
||||||
|
height: 1px;
|
||||||
|
margin: -1px;
|
||||||
|
overflow: hidden;
|
||||||
|
padding: 0;
|
||||||
|
position: absolute;
|
||||||
|
width: 1px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.page__share-title {
|
||||||
|
margin-bottom: 10px;
|
||||||
|
font-size: $type-size-6;
|
||||||
|
text-transform: uppercase;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Page meta
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
.page__meta {
|
||||||
|
margin-top: 2em;
|
||||||
|
color: $muted-text-color;
|
||||||
|
font-family: $sans-serif;
|
||||||
|
font-size: $type-size-6;
|
||||||
|
|
||||||
|
p {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
color: inherit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.page__meta-title {
|
||||||
|
margin-bottom: 10px;
|
||||||
|
font-size: $type-size-6;
|
||||||
|
text-transform: uppercase;
|
||||||
|
}
|
||||||
|
|
||||||
|
.page__meta-sep::before {
|
||||||
|
content: "\2022";
|
||||||
|
padding-left: 0.5em;
|
||||||
|
padding-right: 0.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Page taxonomy
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
.page__taxonomy {
|
||||||
|
.sep {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
strong {
|
||||||
|
margin-right: 10px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.page__taxonomy-item {
|
||||||
|
display: inline-block;
|
||||||
|
margin-right: 5px;
|
||||||
|
margin-bottom: 8px;
|
||||||
|
padding: 5px 10px;
|
||||||
|
text-decoration: none;
|
||||||
|
border: 1px solid mix(#000, $border-color, 25%);
|
||||||
|
border-radius: $border-radius;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
text-decoration: none;
|
||||||
|
color: $link-color-hover;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.taxonomy__section {
|
||||||
|
margin-bottom: 2em;
|
||||||
|
padding-bottom: 1em;
|
||||||
|
|
||||||
|
&:not(:last-child) {
|
||||||
|
border-bottom: solid 1px $border-color;
|
||||||
|
}
|
||||||
|
|
||||||
|
.archive__item-title {
|
||||||
|
margin-top: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.archive__subtitle {
|
||||||
|
clear: both;
|
||||||
|
border: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ .taxonomy__section {
|
||||||
|
margin-top: 2em;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.taxonomy__title {
|
||||||
|
margin-bottom: 0.5em;
|
||||||
|
color: $muted-text-color;
|
||||||
|
}
|
||||||
|
|
||||||
|
.taxonomy__count {
|
||||||
|
color: $muted-text-color;
|
||||||
|
}
|
||||||
|
|
||||||
|
.taxonomy__index {
|
||||||
|
display: grid;
|
||||||
|
grid-column-gap: 2em;
|
||||||
|
grid-template-columns: repeat(2, 1fr);
|
||||||
|
margin: 1.414em 0;
|
||||||
|
padding: 0;
|
||||||
|
font-size: 0.75em;
|
||||||
|
list-style: none;
|
||||||
|
|
||||||
|
@include breakpoint($large) {
|
||||||
|
grid-template-columns: repeat(3, 1fr);
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
display: -webkit-box;
|
||||||
|
display: -ms-flexbox;
|
||||||
|
display: flex;
|
||||||
|
padding: 0.25em 0;
|
||||||
|
-webkit-box-pack: justify;
|
||||||
|
-ms-flex-pack: justify;
|
||||||
|
justify-content: space-between;
|
||||||
|
color: inherit;
|
||||||
|
text-decoration: none;
|
||||||
|
border-bottom: 1px solid $border-color;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.back-to-top {
|
||||||
|
display: block;
|
||||||
|
clear: both;
|
||||||
|
color: $muted-text-color;
|
||||||
|
font-size: 0.6em;
|
||||||
|
text-transform: uppercase;
|
||||||
|
text-align: right;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Comments
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
.page__comments {
|
||||||
|
float: left;
|
||||||
|
margin-left: 0;
|
||||||
|
margin-right: 0;
|
||||||
|
width: 100%;
|
||||||
|
clear: both;
|
||||||
|
}
|
||||||
|
|
||||||
|
.page__comments-title {
|
||||||
|
margin-top: 2rem;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
padding-top: 2rem;
|
||||||
|
font-size: $type-size-6;
|
||||||
|
border-top: 1px solid $border-color;
|
||||||
|
text-transform: uppercase;
|
||||||
|
}
|
||||||
|
|
||||||
|
.page__comments-form {
|
||||||
|
-webkit-transition: $global-transition;
|
||||||
|
transition: $global-transition;
|
||||||
|
|
||||||
|
&.disabled {
|
||||||
|
input,
|
||||||
|
button,
|
||||||
|
textarea,
|
||||||
|
label {
|
||||||
|
pointer-events: none;
|
||||||
|
cursor: not-allowed;
|
||||||
|
filter: alpha(opacity=65);
|
||||||
|
box-shadow: none;
|
||||||
|
opacity: 0.65;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.comment {
|
||||||
|
@include clearfix();
|
||||||
|
margin: 1em 0;
|
||||||
|
|
||||||
|
&:not(:last-child) {
|
||||||
|
border-bottom: 1px solid $border-color;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.comment__avatar-wrapper {
|
||||||
|
float: left;
|
||||||
|
width: 60px;
|
||||||
|
height: 60px;
|
||||||
|
|
||||||
|
@include breakpoint($large) {
|
||||||
|
width: 100px;
|
||||||
|
height: 100px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.comment__avatar {
|
||||||
|
width: 40px;
|
||||||
|
height: 40px;
|
||||||
|
border-radius: 50%;
|
||||||
|
|
||||||
|
@include breakpoint($large) {
|
||||||
|
width: 80px;
|
||||||
|
height: 80px;
|
||||||
|
padding: 5px;
|
||||||
|
border: 1px solid $border-color;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.comment__content-wrapper {
|
||||||
|
float: right;
|
||||||
|
width: calc(100% - 60px);
|
||||||
|
|
||||||
|
@include breakpoint($large) {
|
||||||
|
width: calc(100% - 100px);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.comment__author {
|
||||||
|
margin: 0;
|
||||||
|
|
||||||
|
a {
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.comment__date {
|
||||||
|
@extend .page__meta;
|
||||||
|
margin: 0;
|
||||||
|
|
||||||
|
a {
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Related
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
.page__related {
|
||||||
|
@include clearfix();
|
||||||
|
float: left;
|
||||||
|
margin-top: 2em;
|
||||||
|
padding-top: 1em;
|
||||||
|
border-top: 1px solid $border-color;
|
||||||
|
|
||||||
|
@include breakpoint($large) {
|
||||||
|
float: right;
|
||||||
|
width: calc(100% - #{$right-sidebar-width-narrow});
|
||||||
|
}
|
||||||
|
|
||||||
|
@include breakpoint($x-large) {
|
||||||
|
width: calc(100% - #{$right-sidebar-width});
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
color: inherit;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.page__related-title {
|
||||||
|
margin-bottom: 10px;
|
||||||
|
font-size: $type-size-6;
|
||||||
|
text-transform: uppercase;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Wide Pages
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
.wide {
|
||||||
|
.page {
|
||||||
|
@include breakpoint($large) {
|
||||||
|
padding-right: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@include breakpoint($x-large) {
|
||||||
|
padding-right: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.page__related {
|
||||||
|
@include breakpoint($large) {
|
||||||
|
padding-right: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@include breakpoint($x-large) {
|
||||||
|
padding-right: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
345
docs/_sass/minimal-mistakes/_sidebar.scss
Normal file
345
docs/_sass/minimal-mistakes/_sidebar.scss
Normal file
@ -0,0 +1,345 @@
|
|||||||
|
/* ==========================================================================
|
||||||
|
SIDEBAR
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
/*
|
||||||
|
Default
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
.sidebar {
|
||||||
|
@include clearfix();
|
||||||
|
// @include breakpoint(max-width $large) {
|
||||||
|
// /* fix z-index order of follow links */
|
||||||
|
// position: relative;
|
||||||
|
// z-index: 10;
|
||||||
|
// -webkit-transform: translate3d(0, 0, 0);
|
||||||
|
// transform: translate3d(0, 0, 0);
|
||||||
|
// }
|
||||||
|
|
||||||
|
@include breakpoint($large) {
|
||||||
|
float: left;
|
||||||
|
width: calc(#{$right-sidebar-width-narrow} - 1em);
|
||||||
|
opacity: 0.75;
|
||||||
|
-webkit-transition: opacity 0.2s ease-in-out;
|
||||||
|
transition: opacity 0.2s ease-in-out;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.sticky {
|
||||||
|
overflow-y: auto;
|
||||||
|
/* calculate height of nav list
|
||||||
|
viewport height - nav height - masthead x-padding
|
||||||
|
*/
|
||||||
|
max-height: calc(100vh - #{$nav-height} - 2em);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@include breakpoint($x-large) {
|
||||||
|
width: calc(#{$right-sidebar-width} - 1em);
|
||||||
|
}
|
||||||
|
|
||||||
|
> * {
|
||||||
|
margin-top: 1em;
|
||||||
|
margin-bottom: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
h2,
|
||||||
|
h3,
|
||||||
|
h4,
|
||||||
|
h5,
|
||||||
|
h6 {
|
||||||
|
margin-bottom: 0;
|
||||||
|
font-family: $sans-serif-narrow;
|
||||||
|
}
|
||||||
|
|
||||||
|
p,
|
||||||
|
li {
|
||||||
|
font-family: $sans-serif;
|
||||||
|
font-size: $type-size-6;
|
||||||
|
line-height: 1.5;
|
||||||
|
}
|
||||||
|
|
||||||
|
img {
|
||||||
|
width: 100%;
|
||||||
|
|
||||||
|
&.emoji {
|
||||||
|
width: 20px;
|
||||||
|
height: 20px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.sidebar__right {
|
||||||
|
margin-bottom: 1em;
|
||||||
|
|
||||||
|
@include breakpoint($large) {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
right: 0;
|
||||||
|
width: $right-sidebar-width-narrow;
|
||||||
|
margin-right: -1.5 * $right-sidebar-width-narrow;
|
||||||
|
padding-left: 1em;
|
||||||
|
z-index: 10;
|
||||||
|
|
||||||
|
&.sticky {
|
||||||
|
@include clearfix();
|
||||||
|
position: -webkit-sticky;
|
||||||
|
position: sticky;
|
||||||
|
top: 2em;
|
||||||
|
float: right;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@include breakpoint($x-large) {
|
||||||
|
width: $right-sidebar-width;
|
||||||
|
margin-right: -1.5 * $right-sidebar-width;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.splash .sidebar__right {
|
||||||
|
@include breakpoint($large) {
|
||||||
|
position: relative;
|
||||||
|
float: right;
|
||||||
|
margin-right: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@include breakpoint($x-large) {
|
||||||
|
margin-right: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Author profile and links
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
.author__avatar {
|
||||||
|
display: table-cell;
|
||||||
|
vertical-align: top;
|
||||||
|
width: 36px;
|
||||||
|
height: 36px;
|
||||||
|
|
||||||
|
@include breakpoint($large) {
|
||||||
|
display: block;
|
||||||
|
width: auto;
|
||||||
|
height: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
img {
|
||||||
|
max-width: 110px;
|
||||||
|
border-radius: 50%;
|
||||||
|
|
||||||
|
@include breakpoint($large) {
|
||||||
|
padding: 5px;
|
||||||
|
border: 1px solid $border-color;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.author__content {
|
||||||
|
display: table-cell;
|
||||||
|
vertical-align: top;
|
||||||
|
padding-left: 15px;
|
||||||
|
padding-right: 25px;
|
||||||
|
line-height: 1;
|
||||||
|
|
||||||
|
@include breakpoint($large) {
|
||||||
|
display: block;
|
||||||
|
width: 100%;
|
||||||
|
padding-left: 0;
|
||||||
|
padding-right: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
color: inherit;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.author__name {
|
||||||
|
margin: 0;
|
||||||
|
|
||||||
|
@include breakpoint($large) {
|
||||||
|
margin-top: 10px;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.sidebar .author__name {
|
||||||
|
font-family: $sans-serif;
|
||||||
|
font-size: $type-size-5;
|
||||||
|
}
|
||||||
|
|
||||||
|
.author__bio {
|
||||||
|
margin: 0;
|
||||||
|
|
||||||
|
@include breakpoint($large) {
|
||||||
|
margin-top: 10px;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.author__urls-wrapper {
|
||||||
|
position: relative;
|
||||||
|
display: table-cell;
|
||||||
|
vertical-align: middle;
|
||||||
|
font-family: $sans-serif;
|
||||||
|
z-index: 20;
|
||||||
|
cursor: pointer;
|
||||||
|
|
||||||
|
li:last-child {
|
||||||
|
a {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.author__urls {
|
||||||
|
span.label {
|
||||||
|
padding-left: 5px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@include breakpoint($large) {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
button {
|
||||||
|
position: relative;
|
||||||
|
margin-bottom: 0;
|
||||||
|
|
||||||
|
&:before {
|
||||||
|
@supports (pointer-events: none) {
|
||||||
|
content: '';
|
||||||
|
position: fixed;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
pointer-events: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&.open {
|
||||||
|
&:before {
|
||||||
|
pointer-events: auto;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@include breakpoint($large) {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.author__urls {
|
||||||
|
display: none;
|
||||||
|
position: absolute;
|
||||||
|
right: 0;
|
||||||
|
margin-top: 15px;
|
||||||
|
padding: 10px;
|
||||||
|
list-style-type: none;
|
||||||
|
border: 1px solid $border-color;
|
||||||
|
border-radius: $border-radius;
|
||||||
|
background: $background-color;
|
||||||
|
box-shadow: 0 2px 4px 0 rgba(#000, 0.16), 0 2px 10px 0 rgba(#000, 0.12);
|
||||||
|
cursor: default;
|
||||||
|
|
||||||
|
&.is--visible {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
@include breakpoint($large) {
|
||||||
|
display: block;
|
||||||
|
position: relative;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
border: 0;
|
||||||
|
background: transparent;
|
||||||
|
box-shadow: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:before {
|
||||||
|
display: block;
|
||||||
|
content: "";
|
||||||
|
position: absolute;
|
||||||
|
top: -11px;
|
||||||
|
left: calc(50% - 10px);
|
||||||
|
width: 0;
|
||||||
|
border-style: solid;
|
||||||
|
border-width: 0 10px 10px;
|
||||||
|
border-color: $border-color transparent;
|
||||||
|
z-index: 0;
|
||||||
|
|
||||||
|
@include breakpoint($large) {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&:after {
|
||||||
|
display: block;
|
||||||
|
content: "";
|
||||||
|
position: absolute;
|
||||||
|
top: -10px;
|
||||||
|
left: calc(50% - 10px);
|
||||||
|
width: 0;
|
||||||
|
border-style: solid;
|
||||||
|
border-width: 0 10px 10px;
|
||||||
|
border-color: $background-color transparent;
|
||||||
|
z-index: 1;
|
||||||
|
|
||||||
|
@include breakpoint($large) {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ul {
|
||||||
|
padding: 10px;
|
||||||
|
list-style-type: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
li {
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
display: block;
|
||||||
|
margin-bottom: 5px;
|
||||||
|
padding-right: 5px;
|
||||||
|
padding-top: 2px;
|
||||||
|
padding-bottom: 2px;
|
||||||
|
color: inherit;
|
||||||
|
font-size: $type-size-5;
|
||||||
|
text-decoration: none;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Wide Pages
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
.wide .sidebar__right {
|
||||||
|
margin-bottom: 1em;
|
||||||
|
|
||||||
|
@include breakpoint($large) {
|
||||||
|
position: initial;
|
||||||
|
top: initial;
|
||||||
|
right: initial;
|
||||||
|
width: initial;
|
||||||
|
margin-right: initial;
|
||||||
|
padding-left: initial;
|
||||||
|
z-index: initial;
|
||||||
|
|
||||||
|
&.sticky {
|
||||||
|
float: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@include breakpoint($x-large) {
|
||||||
|
width: initial;
|
||||||
|
margin-right: initial;
|
||||||
|
}
|
||||||
|
}
|
169
docs/_sass/minimal-mistakes/_variables.scss
Normal file
169
docs/_sass/minimal-mistakes/_variables.scss
Normal file
@ -0,0 +1,169 @@
|
|||||||
|
/* ==========================================================================
|
||||||
|
Variables
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
/*
|
||||||
|
Typography
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
$doc-font-size: 15 !default;
|
||||||
|
|
||||||
|
/* paragraph indentation */
|
||||||
|
$paragraph-indent: false !default; // true, false (default)
|
||||||
|
$indent-var: 1.3em !default;
|
||||||
|
|
||||||
|
/* system typefaces */
|
||||||
|
$serif: Georgia, Times, serif !default;
|
||||||
|
$sans-serif: -apple-system, BlinkMacSystemFont, "Roboto", "Segoe UI",
|
||||||
|
"Helvetica Neue", "Lucida Grande", Arial, sans-serif !default;
|
||||||
|
$monospace: Monaco, Consolas, "Lucida Console", monospace !default;
|
||||||
|
|
||||||
|
/* sans serif typefaces */
|
||||||
|
$sans-serif-narrow: $sans-serif !default;
|
||||||
|
$helvetica: Helvetica, "Helvetica Neue", Arial, sans-serif !default;
|
||||||
|
|
||||||
|
/* serif typefaces */
|
||||||
|
$georgia: Georgia, serif !default;
|
||||||
|
$times: Times, serif !default;
|
||||||
|
$bodoni: "Bodoni MT", serif !default;
|
||||||
|
$calisto: "Calisto MT", serif !default;
|
||||||
|
$garamond: Garamond, serif !default;
|
||||||
|
|
||||||
|
$global-font-family: $sans-serif !default;
|
||||||
|
$header-font-family: $sans-serif !default;
|
||||||
|
$caption-font-family: $serif !default;
|
||||||
|
|
||||||
|
/* type scale */
|
||||||
|
$type-size-1: 2.441em !default; // ~39.056px
|
||||||
|
$type-size-2: 1.953em !default; // ~31.248px
|
||||||
|
$type-size-3: 1.563em !default; // ~25.008px
|
||||||
|
$type-size-4: 1.25em !default; // ~20px
|
||||||
|
$type-size-5: 1em !default; // ~16px
|
||||||
|
$type-size-6: 0.75em !default; // ~12px
|
||||||
|
$type-size-7: 0.6875em !default; // ~11px
|
||||||
|
$type-size-8: 0.625em !default; // ~10px
|
||||||
|
|
||||||
|
/* headline scale */
|
||||||
|
$h-size-1: 1.563em !default; // ~25.008px
|
||||||
|
$h-size-2: 1.25em !default; // ~20px
|
||||||
|
$h-size-3: 1.125em !default; // ~18px
|
||||||
|
$h-size-4: 1.0625em !default; // ~17px
|
||||||
|
$h-size-5: 1.03125em !default; // ~16.5px
|
||||||
|
$h-size-6: 1em !default; // ~16px
|
||||||
|
|
||||||
|
/*
|
||||||
|
Colors
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
$gray: #7a8288 !default;
|
||||||
|
$dark-gray: mix(#000, $gray, 50%) !default;
|
||||||
|
$darker-gray: mix(#000, $gray, 60%) !default;
|
||||||
|
$light-gray: mix(#fff, $gray, 50%) !default;
|
||||||
|
$lighter-gray: mix(#fff, $gray, 90%) !default;
|
||||||
|
|
||||||
|
$background-color: #fff !default;
|
||||||
|
$code-background-color: #fafafa !default;
|
||||||
|
$code-background-color-dark: $light-gray !default;
|
||||||
|
$text-color: $dark-gray !default;
|
||||||
|
$muted-text-color: mix(#fff, $text-color, 20%) !default;
|
||||||
|
$border-color: $lighter-gray !default;
|
||||||
|
$form-background-color: $lighter-gray !default;
|
||||||
|
$footer-background-color: $lighter-gray !default;
|
||||||
|
|
||||||
|
$primary-color: #6f777d !default;
|
||||||
|
$success-color: #3fa63f !default;
|
||||||
|
$warning-color: #d67f05 !default;
|
||||||
|
$danger-color: #ee5f5b !default;
|
||||||
|
$info-color: #3b9cba !default;
|
||||||
|
$focus-color: $primary-color !default;
|
||||||
|
$active-color: mix(#fff, $primary-color, 80%) !default;
|
||||||
|
|
||||||
|
/* YIQ color contrast */
|
||||||
|
$yiq-contrasted-dark-default: $dark-gray !default;
|
||||||
|
$yiq-contrasted-light-default: #fff !default;
|
||||||
|
$yiq-contrasted-threshold: 175 !default;
|
||||||
|
$yiq-debug: false !default;
|
||||||
|
|
||||||
|
/* brands */
|
||||||
|
$behance-color: #1769ff !default;
|
||||||
|
$bitbucket-color: #205081 !default;
|
||||||
|
$dribbble-color: #ea4c89 !default;
|
||||||
|
$facebook-color: #3b5998 !default;
|
||||||
|
$flickr-color: #ff0084 !default;
|
||||||
|
$foursquare-color: #0072b1 !default;
|
||||||
|
$github-color: #171516 !default;
|
||||||
|
$gitlab-color: #e24329 !default;
|
||||||
|
$instagram-color: #517fa4 !default;
|
||||||
|
$keybase-color: #ef7639 !default;
|
||||||
|
$lastfm-color: #d51007 !default;
|
||||||
|
$linkedin-color: #007bb6 !default;
|
||||||
|
$mastodon-color: #2b90d9 !default;
|
||||||
|
$pinterest-color: #cb2027 !default;
|
||||||
|
$reddit-color: #ff4500 !default;
|
||||||
|
$rss-color: #fa9b39 !default;
|
||||||
|
$soundcloud-color: #ff3300 !default;
|
||||||
|
$stackoverflow-color: #fe7a15 !default;
|
||||||
|
$tumblr-color: #32506d !default;
|
||||||
|
$twitter-color: #55acee !default;
|
||||||
|
$vimeo-color: #1ab7ea !default;
|
||||||
|
$vine-color: #00bf8f !default;
|
||||||
|
$youtube-color: #bb0000 !default;
|
||||||
|
$xing-color: #006567 !default;
|
||||||
|
|
||||||
|
/* links */
|
||||||
|
$link-color: mix(#000, $info-color, 20%) !default;
|
||||||
|
$link-color-hover: mix(#000, $link-color, 25%) !default;
|
||||||
|
$link-color-visited: mix(#fff, $link-color, 15%) !default;
|
||||||
|
$masthead-link-color: $primary-color !default;
|
||||||
|
$masthead-link-color-hover: mix(#000, $primary-color, 25%) !default;
|
||||||
|
$navicon-link-color-hover: mix(#fff, $primary-color, 75%) !default;
|
||||||
|
|
||||||
|
/* syntax highlighting (base16) */
|
||||||
|
$base00: #263238 !default;
|
||||||
|
$base01: #2e3c43 !default;
|
||||||
|
$base02: #314549 !default;
|
||||||
|
$base03: #546e7a !default;
|
||||||
|
$base04: #b2ccd6 !default;
|
||||||
|
$base05: #eeffff !default;
|
||||||
|
$base06: #eeffff !default;
|
||||||
|
$base07: #ffffff !default;
|
||||||
|
$base08: #f07178 !default;
|
||||||
|
$base09: #f78c6c !default;
|
||||||
|
$base0a: #ffcb6b !default;
|
||||||
|
$base0b: #c3e88d !default;
|
||||||
|
$base0c: #89ddff !default;
|
||||||
|
$base0d: #82aaff !default;
|
||||||
|
$base0e: #c792ea !default;
|
||||||
|
$base0f: #ff5370 !default;
|
||||||
|
|
||||||
|
/*
|
||||||
|
Breakpoints
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
$small: 600px !default;
|
||||||
|
$medium: 768px !default;
|
||||||
|
$medium-wide: 900px !default;
|
||||||
|
$large: 1024px !default;
|
||||||
|
$x-large: 1280x !default;
|
||||||
|
$max-width: $x-large !default;
|
||||||
|
|
||||||
|
/*
|
||||||
|
Grid
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
$right-sidebar-width-narrow: 200px !default;
|
||||||
|
$right-sidebar-width: 300px !default;
|
||||||
|
$right-sidebar-width-wide: 400px !default;
|
||||||
|
|
||||||
|
/*
|
||||||
|
Other
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
$border-radius: 4px !default;
|
||||||
|
$box-shadow: 0 1px 1px rgba(0, 0, 0, 0.125) !default;
|
||||||
|
$nav-height: 2em !default;
|
||||||
|
$nav-toggle-height: 2rem !default;
|
||||||
|
$navicon-width: 1.5rem !default;
|
||||||
|
$navicon-height: 0.25rem !default;
|
||||||
|
$global-transition: all 0.2s ease-in-out !default;
|
||||||
|
$intro-transition: intro 0.3s both !default;
|
23
docs/_sass/minimal-mistakes/skins/_air.scss
Normal file
23
docs/_sass/minimal-mistakes/skins/_air.scss
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
/* ==========================================================================
|
||||||
|
Air skin
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
/* Colors */
|
||||||
|
$background-color: white !default;
|
||||||
|
$text-color: #222831 !default;
|
||||||
|
$muted-text-color: #393e46 !default;
|
||||||
|
$primary-color: #0092ca !default;
|
||||||
|
$border-color: mix(#fff, #393e46, 75%) !default;
|
||||||
|
$footer-background-color: $primary-color !default;
|
||||||
|
$link-color: #393e46 !default;
|
||||||
|
$masthead-link-color: $text-color !default;
|
||||||
|
$masthead-link-color-hover: $text-color !default;
|
||||||
|
$navicon-link-color-hover: mix(#fff, $text-color, 80%) !default;
|
||||||
|
|
||||||
|
.page__footer {
|
||||||
|
color: #fff !important; // override
|
||||||
|
}
|
||||||
|
|
||||||
|
.page__footer-follow .social-icons .svg-inline--fa {
|
||||||
|
color: inherit;
|
||||||
|
}
|
@ -1,5 +1,6 @@
|
|||||||
---
|
---
|
||||||
title: "DeepSpeed Mixture-of-Quantization (MoQ)"
|
title: "DeepSpeed Mixture-of-Quantization (MoQ)"
|
||||||
|
tags: training quantization
|
||||||
---
|
---
|
||||||
|
|
||||||
DeepSpeed introduces new support for model compression using quantization, called Mixture-of-Quantization (MoQ). MoQ is designed on top of QAT (Quantization-Aware Training), with the difference that it schedules various data precisions across the training process. It starts with quantizing the model with a high precision, such as FP16 or 16-bit quantization, and reduce the precision through a pre-defined schedule until reaching the target quantization bits (like 8-bit). Moreover, we use second-order information of the model parameters to dynamically adjust the quantization schedule for each of layer of the network separately. We have seen that by adding such schedule and using various data precision in the training process, we can quantize the model with better quality and preserve accuracy. For a better understanding of MoQ methodology, please refer to MoQ deep-dive, [here](https://www.deepspeed.ai/posts/2021-05-05-MoQ/).
|
DeepSpeed introduces new support for model compression using quantization, called Mixture-of-Quantization (MoQ). MoQ is designed on top of QAT (Quantization-Aware Training), with the difference that it schedules various data precisions across the training process. It starts with quantizing the model with a high precision, such as FP16 or 16-bit quantization, and reduce the precision through a pre-defined schedule until reaching the target quantization bits (like 8-bit). Moreover, we use second-order information of the model parameters to dynamically adjust the quantization schedule for each of layer of the network separately. We have seen that by adding such schedule and using various data precision in the training process, we can quantize the model with better quality and preserve accuracy. For a better understanding of MoQ methodology, please refer to MoQ deep-dive, [here](https://www.deepspeed.ai/posts/2021-05-05-MoQ/).
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
---
|
---
|
||||||
title: "Installation Details"
|
title: "Installation Details"
|
||||||
date: 2020-10-28
|
date: 2020-10-28
|
||||||
|
tags: getting-started
|
||||||
---
|
---
|
||||||
|
|
||||||
The quickest way to get started with DeepSpeed is via pip, this will install
|
The quickest way to get started with DeepSpeed is via pip, this will install
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
---
|
---
|
||||||
title: "Autotuning"
|
title: "Autotuning"
|
||||||
excerpt: "Automatically discover the optimal DeepSpeed configuration that delivers good training speed"
|
excerpt: "Automatically discover the optimal DeepSpeed configuration that delivers good training speed"
|
||||||
|
tags: training performance-tuning
|
||||||
---
|
---
|
||||||
|
|
||||||
Make sure you've read the DeepSpeed tutorials on [Getting Started](https://www.deepspeed.ai/getting-started/) and [Zero Redundancy Optimizer](https://www.deepspeed.ai/tutorials/zero/) before stepping through this tutorial.
|
Make sure you've read the DeepSpeed tutorials on [Getting Started](https://www.deepspeed.ai/getting-started/) and [Zero Redundancy Optimizer](https://www.deepspeed.ai/tutorials/zero/) before stepping through this tutorial.
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
---
|
---
|
||||||
title: "Getting Started with DeepSpeed on Azure"
|
title: "Getting Started with DeepSpeed on Azure"
|
||||||
|
tags: getting-started
|
||||||
---
|
---
|
||||||
|
|
||||||
This tutorial will help you get started running DeepSpeed on [Azure virtual
|
This tutorial will help you get started running DeepSpeed on [Azure virtual
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
---
|
---
|
||||||
title: "BingBertSQuAD Fine-tuning"
|
title: "BingBertSQuAD Fine-tuning"
|
||||||
excerpt: ""
|
excerpt: ""
|
||||||
|
tags: training fine-tuning
|
||||||
---
|
---
|
||||||
|
|
||||||
In this tutorial we will be adding DeepSpeed to the BingBert model for the SQuAD fine-tuning task, called "BingBertSquad" henceforth. We will also demonstrate performance gains.
|
In this tutorial we will be adding DeepSpeed to the BingBert model for the SQuAD fine-tuning task, called "BingBertSquad" henceforth. We will also demonstrate performance gains.
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
---
|
---
|
||||||
title: "BERT Pre-training"
|
title: "BERT Pre-training"
|
||||||
excerpt: ""
|
excerpt: ""
|
||||||
|
tags: training pre-training
|
||||||
---
|
---
|
||||||
|
|
||||||
In this tutorial we will apply DeepSpeed to pre-train the BERT
|
In this tutorial we will apply DeepSpeed to pre-train the BERT
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
---
|
---
|
||||||
title: "CIFAR-10 Tutorial"
|
title: "CIFAR-10 Tutorial"
|
||||||
excerpt: "Train your first model with DeepSpeed!"
|
excerpt: "Train your first model with DeepSpeed!"
|
||||||
|
tags: getting-started
|
||||||
---
|
---
|
||||||
|
|
||||||
If you haven't already, we advise you to first read through the
|
If you haven't already, we advise you to first read through the
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
---
|
---
|
||||||
title: "Curriculum Learning: A Regularization Method for Efficient and Stable Billion-Scale GPT Model Pre-Training"
|
title: "Curriculum Learning: A Regularization Method for Efficient and Stable Billion-Scale GPT Model Pre-Training"
|
||||||
|
tags: training pre-training
|
||||||
---
|
---
|
||||||
|
|
||||||
**Note:**
|
**Note:**
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
---
|
---
|
||||||
title: "Flops Profiler"
|
title: "Flops Profiler"
|
||||||
excerpt: "Measure the parameters, latency, and floating-point operations of your model"
|
excerpt: "Measure the parameters, latency, and floating-point operations of your model"
|
||||||
|
tags: profiling performance-tuning
|
||||||
---
|
---
|
||||||
|
|
||||||
In this tutorial, we introduce the DeepSpeed Flops Profiler and provide examples of its usage.
|
In this tutorial, we introduce the DeepSpeed Flops Profiler and provide examples of its usage.
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
---
|
---
|
||||||
title: "DCGAN Tutorial"
|
title: "DCGAN Tutorial"
|
||||||
excerpt: "Train your first GAN model with DeepSpeed!"
|
excerpt: "Train your first GAN model with DeepSpeed!"
|
||||||
|
tags: getting-started training
|
||||||
---
|
---
|
||||||
|
|
||||||
If you haven't already, we advise you to first read through the [Getting Started](/getting-started/) guide before stepping through this
|
If you haven't already, we advise you to first read through the [Getting Started](/getting-started/) guide before stepping through this
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
title: 'Getting Started'
|
title: 'Getting Started'
|
||||||
permalink: /getting-started/
|
permalink: /getting-started/
|
||||||
excerpt: 'First steps with DeepSpeed'
|
excerpt: 'First steps with DeepSpeed'
|
||||||
date: 2020-05-15
|
tags: getting-started
|
||||||
---
|
---
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
---
|
---
|
||||||
title: "Getting Started with DeepSpeed for Inferencing Transformer based Models"
|
title: "Getting Started with DeepSpeed for Inferencing Transformer based Models"
|
||||||
|
tags: inference
|
||||||
---
|
---
|
||||||
|
|
||||||
DeepSpeed-Inference introduces several features to efficiently serve transformer-based PyTorch models. It supports model parallelism (MP) to fit large models that would otherwise not fit in GPU memory. Even for smaller models, MP can be used to reduce latency for inference. To further reduce latency and cost, we introduce inference-customized kernels. Finally, we propose a novel approach to quantize models, called MoQ, to both shrink the model and reduce the inference cost at production. For more details on the inference related optimizations in DeepSpeed, please refer to our [blog post](https://www.microsoft.com/en-us/research/blog/deepspeed-accelerating-large-scale-model-inference-and-training-via-system-optimizations-and-compression/).
|
DeepSpeed-Inference introduces several features to efficiently serve transformer-based PyTorch models. It supports model parallelism (MP) to fit large models that would otherwise not fit in GPU memory. Even for smaller models, MP can be used to reduce latency for inference. To further reduce latency and cost, we introduce inference-customized kernels. Finally, we propose a novel approach to quantize models, called MoQ, to both shrink the model and reduce the inference cost at production. For more details on the inference related optimizations in DeepSpeed, please refer to our [blog post](https://www.microsoft.com/en-us/research/blog/deepspeed-accelerating-large-scale-model-inference-and-training-via-system-optimizations-and-compression/).
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
---
|
---
|
||||||
title: "Training your large model with DeepSpeed"
|
title: "Training your large model with DeepSpeed"
|
||||||
|
tags: training large-model
|
||||||
---
|
---
|
||||||
|
|
||||||
## Overview
|
## Overview
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
---
|
---
|
||||||
title: "Learning Rate Range Test"
|
title: "Learning Rate Range Test"
|
||||||
|
tags: training learning-rate
|
||||||
---
|
---
|
||||||
This tutorial shows how to use to perform Learning Rate range tests in PyTorch.
|
This tutorial shows how to use to perform Learning Rate range tests in PyTorch.
|
||||||
|
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
---
|
---
|
||||||
title: "Megatron-LM GPT2"
|
title: "Megatron-LM GPT2"
|
||||||
|
tags: training
|
||||||
---
|
---
|
||||||
|
|
||||||
If you haven't already, we advise you to first read through the [Getting
|
If you haven't already, we advise you to first read through the [Getting
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
---
|
---
|
||||||
title: "Getting Started with DeepSpeed-MoE for Inferencing Large-Scale MoE Models"
|
title: "Getting Started with DeepSpeed-MoE for Inferencing Large-Scale MoE Models"
|
||||||
|
tags: MoE inference
|
||||||
---
|
---
|
||||||
|
|
||||||
DeepSpeed-MoE Inference introduces several important features on top of the inference optimization for dense models ([DeepSpeed-Inference blog post](https://www.microsoft.com/en-us/research/blog/deepspeed-accelerating-large-scale-model-inference-and-training-via-system-optimizations-and-compression/)). It embraces several different types of parallelism, i.e. data-parallelism and tensor-slicing for the non-expert parameters and expert-parallelism and expert-slicing for the expert parameters. To maximize the aggregate memory-bandwidth, we provide the communication scheduling with parallelism coordination to effectively group and route tokens with the same critical-data-path. Moreover, we propose new modeling optimizations, PR-MoE and MoS, to reduce MoE model size while maintaining accuracy. For more information on the DeepSpeed MoE inference optimization, please refer to our [blog post]({{ site.press_release_v6 }}).
|
DeepSpeed-MoE Inference introduces several important features on top of the inference optimization for dense models ([DeepSpeed-Inference blog post](https://www.microsoft.com/en-us/research/blog/deepspeed-accelerating-large-scale-model-inference-and-training-via-system-optimizations-and-compression/)). It embraces several different types of parallelism, i.e. data-parallelism and tensor-slicing for the non-expert parameters and expert-parallelism and expert-slicing for the expert parameters. To maximize the aggregate memory-bandwidth, we provide the communication scheduling with parallelism coordination to effectively group and route tokens with the same critical-data-path. Moreover, we propose new modeling optimizations, PR-MoE and MoS, to reduce MoE model size while maintaining accuracy. For more information on the DeepSpeed MoE inference optimization, please refer to our [blog post]({{ site.press_release_v6 }}).
|
@ -1,5 +1,6 @@
|
|||||||
---
|
---
|
||||||
title: "Mixture of Experts for NLG models"
|
title: "Mixture of Experts for NLG models"
|
||||||
|
tags: MoE training
|
||||||
---
|
---
|
||||||
|
|
||||||
In this tutorial, we introduce how to apply DeepSpeed Mixture of Experts (MoE) to NLG models, which reduces the training cost by 5 times and reduce the MoE model size by 3 times (details in our [Blog]({{ site.press_release_v6 }})). We use the GPT-3 like models in Megatron-LM framework as the example. Before reading this tutorial, we recommend to first read the tutorials about [Mixture of Experts](/tutorials/mixture-of-experts/) and [Megatron-LM GPT pre-training](/tutorials/megatron/).
|
In this tutorial, we introduce how to apply DeepSpeed Mixture of Experts (MoE) to NLG models, which reduces the training cost by 5 times and reduce the MoE model size by 3 times (details in our [Blog]({{ site.press_release_v6 }})). We use the GPT-3 like models in Megatron-LM framework as the example. Before reading this tutorial, we recommend to first read the tutorials about [Mixture of Experts](/tutorials/mixture-of-experts/) and [Megatron-LM GPT pre-training](/tutorials/megatron/).
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
---
|
---
|
||||||
title: "Mixture of Experts"
|
title: "Mixture of Experts"
|
||||||
|
tags: MoE training
|
||||||
---
|
---
|
||||||
|
|
||||||
DeepSpeed v0.5 introduces new support for training Mixture of Experts (MoE) models. MoE models are an emerging class of sparsely activated models that have sublinear compute costs with respect to their parameters. For example, the [Switch Transformer](https://arxiv.org/abs/2101.03961) consists of over 1.6 trillion parameters, while the compute required to train it is approximately equal to that of a 10 billion-parameter dense model. This increase in model size offers tremendous accuracy gains for a constant compute budget.
|
DeepSpeed v0.5 introduces new support for training Mixture of Experts (MoE) models. MoE models are an emerging class of sparsely activated models that have sublinear compute costs with respect to their parameters. For example, the [Switch Transformer](https://arxiv.org/abs/2101.03961) consists of over 1.6 trillion parameters, while the compute required to train it is approximately equal to that of a 10 billion-parameter dense model. This increase in model size offers tremendous accuracy gains for a constant compute budget.
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
---
|
---
|
||||||
title: "1-Cycle Schedule"
|
title: "1-Cycle Schedule"
|
||||||
|
tags: training learning-rate
|
||||||
---
|
---
|
||||||
|
|
||||||
This tutorial shows how to implement 1Cycle schedules for learning rate and
|
This tutorial shows how to implement 1Cycle schedules for learning rate and
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
---
|
---
|
||||||
title: "1-bit Adam: Up to 5x less communication volume and up to 3.4x faster training"
|
title: "1-bit Adam: Up to 5x less communication volume and up to 3.4x faster training"
|
||||||
|
tags: training IO
|
||||||
|
toc: false
|
||||||
---
|
---
|
||||||
|
|
||||||
**Note:**
|
**Note:**
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
---
|
---
|
||||||
title: "1-bit LAMB: Communication Efficient Large-Scale Large-Batch Training with LAMB's Convergence Speed"
|
title: "1-bit LAMB: Communication Efficient Large-Scale Large-Batch Training with LAMB's Convergence Speed"
|
||||||
|
tags: training IO
|
||||||
---
|
---
|
||||||
|
|
||||||
**Watch out!**
|
**Watch out!**
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
---
|
---
|
||||||
title: "Pipeline Parallelism"
|
title: "Pipeline Parallelism"
|
||||||
|
tags: training large-model
|
||||||
---
|
---
|
||||||
|
|
||||||
DeepSpeed v0.3 includes new support for pipeline parallelism! Pipeline
|
DeepSpeed v0.3 includes new support for pipeline parallelism! Pipeline
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
title: "Accelerating Training of Transformer-Based Language Models with Progressive Layer Dropping"
|
title: "Accelerating Training of Transformer-Based Language Models with Progressive Layer Dropping"
|
||||||
|
tags: training
|
||||||
---
|
---
|
||||||
|
|
||||||
In this tutorial, we are going to introduce the progressive layer dropping (PLD) in DeepSpeed and provide examples on how to use PLD. PLD allows to train Transformer networks such as BERT 24% faster under the same number of samples and 2.5 times faster to get similar accuracy on downstream tasks. Detailed description of PLD and the experimental results are available in our [technical report](https://arxiv.org/pdf/2010.13369.pdf).
|
In this tutorial, we are going to introduce the progressive layer dropping (PLD) in DeepSpeed and provide examples on how to use PLD. PLD allows to train Transformer networks such as BERT 24% faster under the same number of samples and 2.5 times faster to get similar accuracy on downstream tasks. Detailed description of PLD and the experimental results are available in our [technical report](https://arxiv.org/pdf/2010.13369.pdf).
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
---
|
---
|
||||||
title: "Using PyTorch Profiler with DeepSpeed for performance debugging"
|
title: "Using PyTorch Profiler with DeepSpeed for performance debugging"
|
||||||
|
tags: profiling performance-tuning
|
||||||
---
|
---
|
||||||
|
|
||||||
This tutorial describes how to use [PyTorch Profiler](https://pytorch.org/blog/introducing-pytorch-profiler-the-new-and-improved-performance-tool/) with DeepSpeed.
|
This tutorial describes how to use [PyTorch Profiler](https://pytorch.org/blog/introducing-pytorch-profiler-the-new-and-improved-performance-tool/) with DeepSpeed.
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
---
|
---
|
||||||
title: "DeepSpeed Sparse Attention"
|
title: "DeepSpeed Sparse Attention"
|
||||||
|
tags: training
|
||||||
---
|
---
|
||||||
|
|
||||||
In this tutorial we describe how to use DeepSpeed Sparse Attention (SA) and its building-block kernels. The easiest way to use SA is through DeepSpeed launcher. We will describe this through an example in [How to use sparse attention with DeepSpeed launcher](#how-to-use-sparse-attention-with-deepspeed-launcher) section. But before that, we introduce modules provided by DeepSpeed SA in the [next](#sparse-attention-modules) section.
|
In this tutorial we describe how to use DeepSpeed Sparse Attention (SA) and its building-block kernels. The easiest way to use SA is through DeepSpeed launcher. We will describe this through an example in [How to use sparse attention with DeepSpeed launcher](#how-to-use-sparse-attention-with-deepspeed-launcher) section. But before that, we introduce modules provided by DeepSpeed SA in the [next](#sparse-attention-modules) section.
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
---
|
---
|
||||||
title: "DeepSpeed Transformer Kernel"
|
title: "DeepSpeed Transformer Kernel"
|
||||||
|
tags: training
|
||||||
---
|
---
|
||||||
|
|
||||||
This tutorial shows how to enable the DeepSpeed transformer kernel and set its different configuration parameters.
|
This tutorial shows how to enable the DeepSpeed transformer kernel and set its different configuration parameters.
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user