Try adding the following code to your preamble:
\makeatletter
\catcode`\V=14 % `V' is a comment character unless [verbose]
\def\FloatBarrier{\begingroup \let\@elt\relax
V\edef\@tempa{\write\m@ne{Package placeins Info: Float barrier, from
V input line \the\inputlineno, processed on page \thepage, lands on
V page \noexpand\thepage. }}\@tempa
\edef\@tempa{\@fb@botlist\@deferlist\@dbldeferlist}%
\ifx\@tempa\@empty V\PackageInfo{placeins}{No floats held,}%
\else
\ifx\@fltovf\relax % my indicator of recursion
\if@firstcolumn V\PackageWarning{placeins}{Some floats are stuck,}%
\clearpage
\else V\PackageInfo{placeins}{Eject a column and check again:}%
\null\newpage\FloatBarrier
\fi
\else V\PackageInfo{placeins}{Must dump some floats}%
\newpage \let\@fltovf\relax V\PackageInfo{placeins}{Check again:}%
\FloatBarrier % recurse once only
\fi\fi \endgroup
\@fb@topbarrier }
\catcode`\V=11
\renewenvironment{@tufte@margin@float}[2][0pt]{%
\FloatBarrier% process all floats before this point so the figure/table numbers stay in order.
\begin{lrbox}{\@tufte@margin@floatbox}%
\begin{minipage}[t]{\marginparwidth}% top-aligned minipage
\@tufte@caption@font
\def\@captype{#2}%
\hbox{}\vspace*{#1}%
\@tufte@caption@justification
\@tufte@margin@par
\noindent
}{%
\end{minipage}%
\end{lrbox}%
\marginpar{\usebox{\@tufte@margin@floatbox}}%
}
%%
% Margin figure environment
\renewenvironment{marginfigure}[1][-7pt]%
{\begin{@tufte@margin@float}[#1]{figure}}
{\end{@tufte@margin@float}}
\makeatother
The only difference between this code and the code from the Tufte-LaTeX document classes is that the minipage
environment in the new code is top-aligned as opposed to center-aligned and the default offset was changed from -1.2ex
to 0pt
.