.. Licensed to the Apache Software Foundation (ASF) under one
   or more contributor license agreements.  See the NOTICE file
   distributed with this work for additional information
   regarding copyright ownership.  The ASF licenses this file
   to you under the Apache License, Version 2.0 (the
   "License"); you may not use this file except in compliance
   with the License.  You may obtain a copy of the License at

     http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing,
   software distributed under the License is distributed on an
   "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
   KIND, either express or implied.  See the License for the
   specific language governing permissions and limitations
   under the License.

Compression
===========
The following tutorials will help you learn how to use compression techniques with MXNet.

.. container:: cards

   .. card::
      :title: Compression: float16
      :link: https://mxnet.apache.org/api/faq/float16

      How to use float16 in your model to boost training speed.

   .. card::
      :title: Gradient Compression
      :link: https://mxnet.apache.org/api/faq/gradient_compression

      How to use gradient compression to reduce communication bandwidth and increase speed.

   .. card::
      :title: Inference with Quantized Models
      :link: https://gluon-cv.mxnet.io/build/examples_deployment/int8_inference.html

      How to use quantized GluonCV models for inference on Intel Xeon Processors to gain higher performance.

   .. card::
      :title: Compression: int8
      :link: int8.html

      How to use int8 in your model to boost training speed.


.. toctree::
   :hidden:
   :glob:

   *
   Float16 <https://mxnet.apache.org/api/faq/float16>
   Gradient Compression  <https://mxnet.apache.org/api/faq/gradient_compression>
   GluonCV with Quantized Models <https://gluon-cv.mxnet.io/build/examples_deployment/int8_inference.html>
